You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:脚本自动同步证书到上下文
    编写构建脚本自动把系统证书复制到当前上下文的临时目录,构建完成后自动清理,不会改动原有证书的存储位置:
    1. 编写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
    
    1. 修改Dockerfile中的COPY语句:
    COPY ./tmp_cert/fullchain.pem /etc/nginx/ssl/
    COPY ./tmp_cert/privkey.pem /etc/nginx/ssl/
    
    1. 把tmp_cert加入.dockerignore避免冗余文件打入上下文。
      执行chmod +x build.sh && ./build.sh即可完成构建。
  • 方案3:使用BuildKit秘钥传递(最安全,推荐生产使用)
    利用Docker BuildKit的秘钥挂载功能,不需要把证书复制到上下文目录,也不会把证书写入镜像构建历史:
    1. 修改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
    
    1. 执行构建命令前先开启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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:18:01