如何从子文件夹中的Dockerfile正确构建Docker镜像
问题根因
两个报错都和Docker构建的核心规则「构建上下文」有关,-f参数并未过时:
- 执行
docker build etc/时,Docker会把etc/目录作为唯一的构建上下文,构建过程中仅能访问该目录下的文件。你的package.json、yarn.lock都存放在etc的上级目录(项目根目录),不在上下文范围内,自然会触发文件找不到的错误。 - 执行
docker build -f etc/Dockerfile时提示参数缺失,是因为docker build命令必须在末尾指定构建上下文路径,你只声明了Dockerfile的存放位置,没有传入上下文路径,不符合命令语法要求。
正确构建方法
- 先将终端工作目录切换到项目根目录(即存放
package.json、yarn.lock的目录层级) - 执行以下构建命令即可:
docker build -f etc/Dockerfile .
- 你现有的Dockerfile内容不需要做任何修改,保持原有的
COPY package.json yarn.lock ./写法就可以正常工作。
参数说明
- 命令末尾的
.:代表将当前目录(项目根目录)设置为构建上下文,构建过程中可以正常访问根目录下的所有项目文件,包括后续Next.js构建需要的源码、配置文件等。 -f etc/Dockerfile:告诉Docker不要读取上下文根目录下默认命名的Dockerfile,而是加载etc子目录下的Dockerfile配置,这是当前Docker版本的标准用法,不存在废弃或过时的问题。
注意:Docker默认禁止COPY指令访问构建上下文范围外的文件,不要尝试在Dockerfile里写
../package.json这类跨出上下文目录的路径,即使写了也会被Docker拦截报错。
内容的提问来源于stack exchange,提问作者Giesburts
相关产品推荐
相关产品推荐

