首页 > 解决方案 > 在 Dockerfile 基础映像中公开端口是否会在最终映像中公开它们?

问题描述

这里我有一个 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"]

我对基础映像所做的事情(例如公开端口)是否扩展到最终映像?

标签: dockerdockerfile

解决方案


EXPOSE指令似乎主要用于文档目的(仅?)。

文档中

EXPOSE 指令实际上并不发布端口。它充当构建映像的人和运行容器的人之间的一种文档类型,关于打算发布哪些端口

因此,除了最后一步/Dockerfile 之外,我看不出有任何理由在任何地方声明它。

也就是说,EXPOSE父图像中的任何指令(无论是否多阶段)都将反映在任何后续子图像的元数据中。

例子:

# Dockerfile
FROM scratch AS base
EXPOSE 80

FROM base
ENV HELLO world

然后运行:

$ docker build -t temp .
$ docker image inspect temp

这将输出(除其他外):

"ExposedPorts": {
  "80/tcp": {}
},

推荐阅读