Docker COPY指令执行失败:构建上下文中未找到文件(Dockerfile配置问题)
报错根本原因
你遇到的报错是Docker构建上下文限制导致的:
COPY failed: file not found in build context or excluded by .dockerignore: stat etc/.auth_keys/fullchain.pem: file does not exist
Docker在执行构建操作时,只会读取你执行docker build命令时最后指定的目录(即构建上下文)下的文件,无法直接访问上下文外的系统路径。你要拷贝的/etc/.auth_keys/目录位于系统根路径,不在默认的Dockerfile所在目录的上下文范围内,因此不管写相对路径还是绝对路径都无法找到文件,和.dockerignore配置无关。
解决方案
下面是3种符合不同需求的解决方式:
- 方案1:临时调整构建上下文(仅适合测试)
直接将系统根目录作为构建上下文执行构建,执行命令时指定Dockerfile位置:docker build -f /path/to/your/Dockerfile /
同时修改Dockerfile中的COPY语句:
注意:该方案会打包整个系统根目录作为上下文,构建速度慢、风险高,不要在生产环境使用。COPY etc/.auth_keys/fullchain.pem /etc/nginx/ssl/ COPY etc/.auth_keys/privkey.pem /etc/nginx/ssl/ - 方案2:脚本自动同步证书到上下文
编写构建脚本自动把系统证书复制到当前上下文的临时目录,构建完成后自动清理,不会改动原有证书的存储位置:- 编写
build.sh脚本:
#!/bin/bash # 创建临时目录存储证书 mkdir -p ./tmp_cert # 复制系统证书到临时目录 cp /etc/.auth_keys/fullchain.pem ./tmp_cert/ cp /etc/.auth_keys/privkey.pem ./tmp_cert/ # 执行镜像构建 docker build -t your-nginx-image . # 清理临时文件 rm -rf ./tmp_cert- 修改Dockerfile中的COPY语句:
COPY ./tmp_cert/fullchain.pem /etc/nginx/ssl/ COPY ./tmp_cert/privkey.pem /etc/nginx/ssl/- 把
tmp_cert加入.dockerignore避免冗余文件打入上下文。
执行chmod +x build.sh && ./build.sh即可完成构建。
- 编写
- 方案3:使用BuildKit秘钥传递(最安全,推荐生产使用)
利用Docker BuildKit的秘钥挂载功能,不需要把证书复制到上下文目录,也不会把证书写入镜像构建历史:- 修改Dockerfile,在首行加上语法声明,调整证书复制逻辑:
# syntax=docker/dockerfile:1.2 FROM nginx:1.21.3-alpine RUN rm /etc/nginx/conf.d/default.conf RUN mkdir /etc/nginx/ssl COPY nginx.conf /etc/nginx/conf.d RUN --mount=type=secret,id=fullchain cp /run/secrets/fullchain /etc/nginx/ssl/fullchain.pem RUN --mount=type=secret,id=privkey cp /run/secrets/privkey /etc/nginx/ssl/privkey.pem WORKDIR /usr/src/app- 执行构建命令前先开启BuildKit,构建时传入证书路径:
export DOCKER_BUILDKIT=1 docker build \ --secret id=fullchain,src=/etc/.auth_keys/fullchain.pem \ --secret id=privkey,src=/etc/.auth_keys/privkey.pem \ -t your-nginx-image .
内容的提问来源于stack exchange,提问作者Jaco
相关产品推荐
相关产品推荐

