.dockerignore 放在哪里?

Ada*_*hes 6 python pycharm docker

考虑以下典型的python项目结构:

fooproject 
  - main.py
  - src/
  - test/
  - logs/
  - Dockerfile
  - .dockerignore
  - README.md
Run Code Online (Sandbox Code Playgroud)

该.dockerfile应防止test/logs/被包含在泊坞窗图像中的目录。

test/
logs/
Run Code Online (Sandbox Code Playgroud)

的内容Dockerfile

FROM ubuntu16.04

COPY . /app/
WORKDIR /app    
USER root    
RUN pip install -r requirements.txt    
ENTRYPOINT ["main.py"]
Run Code Online (Sandbox Code Playgroud)

但是,当通过 PyCharm 的自动 docker 集成运行时,testlogs目录都被复制到容器中。PyCharm 运行命令的结果如下:

7eb643d9785b:python -u /opt/project/main.py 
Run Code Online (Sandbox Code Playgroud)

我尝试了一些无济于事的方法,例如.dockerignore在应用程序其余部分上方的目录中制作副本。例如:

COPY . /app/
COPY .dockerignore .dockerignore
WORKDIR /app
Run Code Online (Sandbox Code Playgroud)

想知道 PyCharm 是否有可能/opt/project以某种方式进行干扰?那么.dockerignore 在这样的项目中究竟应该放在什么位置?

更新

docker container inspect与 BMitch分享了 的输出,他能够找到解决方案。PyCharm 在容器设置运行配置中自动挂载一个卷

在此处输入图片说明

BMi*_*tch 7

.dockerignore用于控制都包含在构建背景下哪些文件。这会影响Dockerfile 中的COPYADD命令,并最终影响生成的映像。当您使用卷挂载运行该映像时,例如:

        {
            "Type": "bind",
            "Source": "/home/adam/Desktop/Dev/ec2-data-analysis/grimlock",
            "Destination": "/opt/project",
            "Mode": "rw",
            "RW": true,
            "Propagation": "rprivate"
        },
Run Code Online (Sandbox Code Playgroud)

该卷挂载会覆盖该容器的映像内容。对路径的所有访问都将转到您的桌面目录而不是图像内容,并且 Linux 绑定挂载没有.dockerignore文件的概念。

当您在没有卷挂载的情况下运行此映像时,您应该会看到不同的行为。


对于将来遇到此问题的任何人,都.dockerignore需要在构建上下文的根中。构建上下文是您在构建命令末尾传递的目录,通常是 a.或当前目录。如果您启用 BuildKit,它将首先检查Dockerfile.dockerignore您的 Dockerfile 路径/名称可以更改的位置。并测试您的.dockerignore,请参阅此答案