COPY指令源路径必须位于构建上下文中,不支持宿主机绝对路径;目标路径可为绝对路径,会自动创建不存在的父目录。
COPY 指令不支持直接使用绝对路径作为源路径,这是 Docker 构建机制决定的——它只能从构建上下文(build context)目录及其子目录中复制文件。所谓“绝对路径”在 COPY 中若写成 /some/path/file.txt,Docker 会把它当作相对于构建上下文根目录的路径(即等价于 some/path/file.txt),而不是宿主机真正的根目录。
很多人尝试写 COPY /home/user/app.js /app/,期望复制宿主机上的绝对路径文件,这会失败并报错:file not found in build context。因为 Docker daemon 根本无法访问宿主机任意位置,只认你执行 docker build 时指定的上下文目录(默认是当前目录 .)。
COPY /opt/myconfig.conf /etc/myapp/(除非 /opt/myconfig.conf 已被手动拷贝进当前构建目录)COPY /app.js /app/ 实际查找的是构建目录下的 app.js,不是宿主机根目录下的 /app.js
若你确实需要把宿主机某个绝对路径下的文件打进镜像,必须先将该文件“带入”构建上下文:
cp /etc/hosts ./build-context/hosts
COPY build-context/hosts /etc/hosts
ln -s /etc/hosts ./hosts,再 COPY hosts /etc/hosts
docker build -f Dockerfile -t myimg /path/to/context,确保目标文件在该路径内COPY 的第二个参数(目标路径)可以且推荐使用绝对路径,因为容器内文件系统以 / 为根:
COPY app.js /usr/src/app/ ✅ 清晰、可预测COPY app.js usr/src/app/ ❌ 会被解释为相对路径 $WORKDIR/usr/src/app/,容易出错/usr/src/app)对于敏感或动态文件(如配置、证书),更推荐用构建参数或多阶段构建规避上下文限制:
--build-arg 传入内容,再用 echo "$ARG" > /path/in/container
RUN curl 或 git clone 下载,再 COPY --from=builder
docker run -v /host/path:/container/path,比打包进镜像更灵活安全