我在工作中收到一个问题,让我对一个开源 Dockerfile进行了修改,问题归结为“你为什么改变了层数?” - 因此我正在尝试通过自己的调查来回答这个问题。
非常抱歉,该主题定义不够明确,但实质上它与Docker层如何与Docker缓存相关。
因此,在这个文档不是很规范的领域里,我正在寻找一种简洁的解释。
我的更改包括将ENV分成不同的层,将COPY操作提前,并稍后公开端口。
原始 Dockerfile(经过简化):
FROM ubuntu:latest
EXPOSE 80
ENV HELLO world \
&& DOCKER whale
RUN # Run stuff
COPY source /to/container
CMD # Do stuff
我的更改:
FROM ubuntu:latest
ENV HELLO world
ENV DOCKER whale # <-- Separate ENV into different layers
COPY source /to/container # <-- Less prone to change, move earlier
RUN # Run stuff
EXPOSE 80 # <-- "Bake in" port later
CMD # Do stuff
前提条件
据我所知,从 docker-cache 的角度来看,将 ENV 变量分成不同的层是一种很好的做法,因为如果用户想要覆盖某个 ENV,则只需更改其自己层中的一个 ENV,而不是为了一个 ENV 更改包含所有 ENV 的整个层。
但是稍后添加端口 EXPOSE 就感觉对了。这是因为我使用 Docker 已经有大约 18 个月的时间了,几乎所有 Docker 的文档和指南都会在 Dockerfile 中稍后暴露端口。
根据我的经验(参加过 DockerCon2017 并参加了一些“最佳实践”课程),我也相信这一点,更容易更改/覆盖的层应该放在 Dockerfile 的后面,以更好地优化 docker-cache,从而避免太多低级别的层变化。
问题:
如果将 ENV 层分离、将 COPY 提前并将 EXPOSE 层放置在后面,是否是一种良好的做法,从优化 Docker 缓存的角度来看,是否是对原始 Dockerfile 层的整体改进?
RUN stuff
是什么,ENV
变量在哪里使用? - johnharris85