这里我有一个 Dockerfile。
请注意,我使用带有许多库 (~2Gb) 的大型基础映像,运行我的构建,然后将输出复制到较小的映像以供执行。我理解这是一种常见做法。
# Create a base from the .net core 2.2 debian image
FROM microsoft/dotnet:2.2-sdk AS base #<======== Base image (debian)
WORKDIR /app
# Expose ports 80 and 443
EXPOSE 80 #<======== Expose ports
EXPOSE 443
FROM base AS publish
WORKDIR /app
# Copy projects and src files into build image
COPY ./src/. ./src/.
# Run publish
RUN dotnet publish ./src/Core/helloworld.Core.csproj -c Release -o /app
# Create final image #<========= Completely new image (alpine)
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-alpine3.9 AS final
WORKDIR /app
# Copy app from publish
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "helloworld.Core.dll"]
Run Code Online (Sandbox Code Playgroud)
我对基础映像所做的事情(例如公开端口)是否会扩展到最终映像?
该EXPOSE指令似乎主要用于文档目的(仅?)。
从文档中:
EXPOSE指令实际上并不发布端口。它充当构建镜像的人和运行容器的人之间的一种文档,关于要发布哪些端口
因此,除了最后一步/Dockerfile 之外,我看不出有任何理由在任何地方声明这一点。
也就是说,EXPOSE父映像中的任何指令(无论是否为多阶段)都将反映在任何后续子映像的元数据中。
例子:
# Dockerfile
FROM scratch AS base
EXPOSE 80
FROM base
ENV HELLO world
Run Code Online (Sandbox Code Playgroud)
然后运行:
$ docker build -t temp .
$ docker image inspect temp
Run Code Online (Sandbox Code Playgroud)
它将输出(除其他外):
"ExposedPorts": {
"80/tcp": {}
},
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1152 次 |
| 最近记录: |