Nginx官方父镜像Dockerfile构建上下文与COPY源文件位置问题
问题解答
核心逻辑
你本地编写仅包含FROM nginx的Dockerfile构建自定义镜像时,不会执行Nginx官方Dockerfile里的任何指令——这些指令早在官方团队构建、发布公共Nginx镜像时就已经执行完成,你拉取到本地的Nginx镜像已经是包含所有构建结果的成品,不需要你本地提供COPY指令对应的源文件。
具体说明
- Docker镜像采用分层存储机制,基础镜像的每一层构建结果都会被永久固化。后续基于
FROM指令做二次构建时,只会执行你自定义Dockerfile里的指令,在基础镜像的顶层叠加新的分层,不会回溯重跑基础镜像Dockerfile里的任何操作。 - Nginx官方构建镜像时,使用的构建上下文就是官方构建环境中,对应版本Dockerfile所在的同级目录。你看到的两行COPY指令:
复制的源文件就是和该Dockerfile存放在同一目录下的两个本地脚本。官方在构建环境中传入对应目录作为构建上下文,执行build命令生成最终镜像后,这两个脚本就已经被打包进镜像的固定路径:前者在镜像根目录COPY docker-entrypoint.sh / COPY 10-listen-on-ipv6-by-default.sh /docker-entrypoint.d/下,后者在镜像的/docker-entrypoint.d目录下。 - 你可以在本地直接运行命令验证文件存在:
docker run --rm nginx ls / /docker-entrypoint.d,输出的文件列表里就能看到这两个脚本,和你本地构建自定义镜像时用的构建上下文没有任何关联。 - Ubuntu等其他官方镜像的逻辑完全一致:官方Dockerfile中所有涉及本地文件复制的指令,都是官方在镜像构建发布阶段,基于自身构建环境内的上下文文件执行的,所有复制进去的文件都已经随镜像分层一起打包,用户拉取镜像后即可直接使用,不需要本地准备对应源文件。
常见认知误区:不少Docker初学者会误以为
FROM某个基础镜像时,会拉取基础镜像的Dockerfile在本地重跑一遍,实际上你从公共仓库拉取的已经是构建完成的二进制镜像包,不存在本地重跑基础镜像构建流程的环节。
内容的提问来源于stack exchange,提问作者Unknown developer
相关产品推荐
相关产品推荐

