代码之家  ›  专栏  ›  技术社区  ›  user842225

Docker构建上下文难题

  •  0
  • user842225  · 技术社区  · 3 年前

    我的项目结构:

    projectRoot/
       - service/ 
         - data.json
         - Dockerfile
    

    因为 Dockerfile :

    FROM node:16.14-alpine3.14
    
    ENV THE_DATA=/tmp/data.json
    
    COPY data.json /tmp/data.json
    

    在project root下,如果我构建映像:

    docker build -t service:data_tmp -f service/Dockerfile .
    

    我得到一个错误:

     => ERROR [2/2] COPY data.json /tmp/data.json 
    ...
    failed to compute cache key: "/data.json" not found: not found
    

    我猜这个错误是由于最后一个错误造成的 . 指示生成上下文是项目根,这就是 data.json 找不到。

    ( 我的第二次尝试 )然后,我改变了主意 Dockerfile 致:

    FROM node:16.14-alpine3.14
    
    ENV THE_DATA=/tmp/data.json
    
    COPY ./service/data.json /tmp/data.json
    

    但是得到错误:

    => ERROR [2/2] COPY ./service/data.json /tmp/data.json 
    ...
    failed to compute cache key: "/service/data.json" not found: not found
    

    ( 我的第三次尝试 成功)通过将构建上下文更改为 /service/ :

    docker build -t service:data_tmp -f service/Dockerfile /service/
    

    但我不明白为什么我的 第二次尝试 上面说的不起作用吗?我的意思是在我的第二次尝试中,即使构建上下文仍然是 . 意思是当前目录,意思是项目根,然后是路径 COPY 从…起 ./service/data.json 应该是正确的。为什么我还在那里?

    0 回复  |  直到 3 年前
        1
  •  1
  •   BMitch    3 年前

    当文件系统中存在的文件在 COPY 第二步,检查两件事:

    1. 您的上下文,这是在这里完成的。这就是问题所在 . 在build命令的末尾,表示上下文是当前目录。如果你传递了一个不同的目录,那就是 复制 步骤(至少是那些不改变源代码的步骤) --from ).
    2. A. .dockerignore 文件它位于上下文的根目录中,语法与 .gitignore .更改上下文时,您更改docker检查 dockerignore先生 文件

    最小docker构建的常见模式是指定 dockerignore先生 提交给:

    *
    !src
    # ...
    

    它告诉docker排除第一行的所有内容,然后重新包含 src 在第二行。您可以添加额外的行,以在此处重新包含文件夹 !service .