【问题标题】:Can dockerfile be put in .dockerignore?dockerfile可以放在.dockerignore中吗?
【发布时间】:2017-12-08 03:44:01
【问题描述】:

文档说可以。

https://docs.docker.com/engine/reference/builder/

您甚至可以使用 .dockerignore 文件来排除 Dockerfile 和 .dockerignore 文件。这些文件仍然被发送到守护进程,因为它需要它们来完成它的工作。但是 ADD 和 COPY 指令不会将它们复制到图像中。

但是当我将 dockerfile 放入 .dockerignore 时,我得到了

Sending build context to Docker daemon  1.646MB
Error response from daemon: Cannot locate specified Dockerfile: Dockerfile

【问题讨论】:

    标签: docker dockerfile


    【解决方案1】:

    是的,你可以;你甚至可以把.dockerignore 自己扔进去!

    您可能做了其他不正确的事情 - 可能在错误的目录中?

    目录列表:

    ➜  ls -la
    total 16
    drwxr-xr-x  4 tj    wheel  128 Nov 30 13:42 .
    drwxrwxrwt  7 root  wheel  224 Nov 30 13:42 ..
    -rw-r--r--  1 tj    wheel   26 Nov 30 13:41 .dockerignore
    -rw-r--r--  1 tj    wheel   28 Nov 30 13:42 Dockerfile
    

    文件内容:

    ➜  cat .dockerignore
    .dockerignore
    Dockerfile
    
    ➜  test_docker_ignore cat Dockerfile
    FROM ubuntu:16.04
    ADD . .
    

    构建一次;将--no-cache 指定为详细:

    ➜  docker build -t test --no-cache .
    Sending build context to Docker daemon  3.072kB
    Step 1/2 : FROM ubuntu:16.04
     ---> 20c44cd7596f
    Step 2/2 : ADD . .
     ---> 4d8ded297954
    Successfully built 4d8ded297954
    Successfully tagged test:latest
    

    Dockerfile 添加一些内容并重建: 该构建将使用缓存,因为它忽略了对 Dockerfile 所做的更改

    ➜  echo "# A Test Comment" >> Dockerfile
    ➜  docker build -t test .
    Sending build context to Docker daemon  3.072kB
    Step 1/2 : FROM ubuntu:16.04
     ---> 20c44cd7596f
    Step 2/2 : ADD . .
     ---> Using cache
     ---> 4d8ded297954
    Successfully built 4d8ded297954
    Successfully tagged test:latest
    

    【讨论】:

    • ` ---> Using cache` 行存在的原因并不是因为它忽略了对 Dockerfile 所做的更改。它在那里是因为 docker 知道在文件末尾添加注释行对生成的图像没有任何影响。另一方面,如果您将add . . 更改为add . /mydir,它将不会使用缓存。您的回答仅有助于表明在 .dockerignore 中使用 dockerfile 构建图像是可能的。
    【解决方案2】:

    这个问题被编辑了一段时间,我没有注意到。原始问题更准确地反映了我所缺少的知识以及我遇到的问题,并且我已恢复到该版本。

    Docker 在一定程度上同等对待名称“dockerfile”和“Dockerfile”。也就是说,您可以将其称为“dockerfile”,如果您执行docker build -t blah . 之类的操作,docker 仍会自动使用它。但是,如果您随后将 dockerfile 放入 .dockerignore 文件中,它就不再知道如何自动构建您的图像,您将获得

    Error response from daemon: Cannot locate specified Dockerfile: Dockerfile

    【讨论】:

      【解决方案3】:

      确保您运行的是当前版本的 docker。旧版本与文档不匹配。此功能是在release 1.5 中添加的。

      $ cat .dockerignore 
      Dockerfile
      .dockerignore
      
      $ cat Dockerfile 
      FROM busybox
      COPY . /context
      WORKDIR /context
      CMD find .
      
      $ docker build -t test-context .                               
      Sending build context to Docker daemon  4.096kB
      Step 1/4 : FROM busybox
       ---> 54511612f1c4
      Step 2/4 : COPY . /context
       ---> bd941f5e9e18
      Step 3/4 : WORKDIR /context
      Removing intermediate container 47245e176bf4
       ---> c25ebcc95d95
      Step 4/4 : CMD find .
       ---> Running in 6c1b05066c80
      Removing intermediate container 6c1b05066c80
       ---> 6ee47079b59c
      Successfully built 6ee47079b59c
      Successfully tagged test-context:latest
      
      $ docker run -it --rm test-context                             
      .
      ./test-file2
      ./test-file1
      
      $ docker version
      Client:
       Version:      17.11.0-ce
       API version:  1.34
       Go version:   go1.8.3
       Git commit:   1caf76c
       Built:        Mon Nov 20 18:36:33 2017
       OS/Arch:      linux/amd64
      
      Server:
       Version:      17.11.0-ce
       API version:  1.34 (minimum version 1.12)
       Go version:   go1.8.3
       Git commit:   1caf76c
       Built:        Mon Nov 20 18:35:05 2017
       OS/Arch:      linux/amd64
       Experimental: true
      

      【讨论】:

        猜你喜欢
        • 2019-01-22
        • 2020-06-28
        • 2021-12-02
        • 1970-01-01
        • 1970-01-01
        • 2022-11-19
        • 1970-01-01
        • 2020-09-24
        • 2019-10-21
        相关资源
        最近更新 更多