docker - 在 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"]
我对基础映像所做的事情(例如公开端口)是否扩展到最终映像?
解决方案
该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": {}
},
推荐阅读
- sql - 如何检查开始和结束日期是否不干扰其他开始和结束日期
- javascript - React , Leaflet , Converting or Exporting map into an image or in byte64 format
- c# - IQueryable 不允许 ThenBy
- javascript - SharePoint - Angular 2+ 中的 GetURLKeyValue
- r - 将图像插入 Google 表格的 R 脚本
- machine-learning - 我可以使用哪些文本分类算法对客户聊天消息进行分类?
- ngrx - JSON Monolith 模型,它与状态和构建 Store 有什么关系?
- python - 在python中复制构造函数
- spring-boot - Jhipster - JWT 已过期
- javascript - 实际上阻止此页面创建对话框