从非Dockerfile所在目录执行docker build命令报错求助
问题分析与解决建议
问题场景
Node.js应用文件存放在users/node目录下,在根目录执行以下构建命令时失败:
docker build -f node/Dockerfile -t my-service .
但进入node目录后执行以下命令则构建成功:
docker build -f Dockerfile -t vineelpellella:visits-service .
相关文件内容
Dockerfile
From node:alpine WORKDIR /usr/node COPY ./ ./ RUN npm install CMD ["npm", "start"]
package.json
{ "dependencies": { "express": "*", }, "scripts": { "start": "node index.js" } }
index.js
const express = require('express'); const app = express(); app.listen(8081, () => { console.log('listening on port 8081'); });
错误信息
> [4/4] RUN npm install: #8 2.766 npm ERR! code ENOENT #8 2.768 npm ERR! syscall open #8 2.768 npm ERR! path /usr/node/package.json #8 2.771 npm ERR! errno -2 #8 2.779 npm ERR! enoent ENOENT: no such file or directory, open '/usr/node/package.json' #8 2.779 npm ERR! enoent This is related to npm not being able to find a file. #8 2.780 npm ERR! enoent #8 2.787 #8 2.788 npm ERR! A complete log of this run can be found in: #8 2.788 npm ERR! /root/.npm/_logs/2022-07-21T13_36_42_578Z-debug-0.log ------ executor failed running [/bin/sh -c npm install]: exit code: 254
核心原因
问题出在Docker构建上下文的差异:
- 根目录执行构建时,命令末尾的
.指定构建上下文为根目录,Dockerfile里的COPY ./ ./会把根目录下的所有文件复制到容器的/usr/node目录,但package.json实际在node子目录下,根目录中没有该文件,因此容器内找不到package.json导致npm install失败。 - 进入
node目录执行构建时,上下文变为node目录,COPY ./ ./会把当前目录(node目录)下的package.json、index.js等文件复制到容器内,自然能正常执行npm install。
解决方法
方法1:修改Dockerfile的COPY路径
将Dockerfile中的COPY命令调整为从构建上下文的node子目录复制文件:
From node:alpine WORKDIR /usr/node COPY node/ ./ # 指定复制根上下文下的node目录内容 RUN npm install CMD ["npm", "start"]
修改后,在根目录执行原构建命令即可成功。
方法2:修改构建命令的上下文目录
执行构建时,将上下文指定为node目录,而不是根目录:
docker build -f node/Dockerfile -t my-service ./node
这样Docker会以node目录为上下文,COPY ./ ./就能正确复制到所需文件,无需修改Dockerfile。
方法3:调整Dockerfile存放位置(推荐)
将Dockerfile保留在node目录下,日常构建时进入node目录执行命令,或者在根目录执行:
docker build -t my-service ./node
这种方式符合常规项目结构,上下文清晰,不易出错。
内容的提问来源于stack exchange,提问作者Vineel Pellella
相关产品推荐
相关产品推荐

