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

fooproject
  - main.py
  - src/
  - test/
  - logs/
  - Dockerfile
  - .dockerignore
  - README.md

.dockerfile 应该防止 test/logs/ 目录被包含在 docker 镜像中。
test/
logs/
Dockerfile 的内容是
FROM ubuntu16.04

COPY . /app/
WORKDIR /app
USER root
RUN pip install -r requirements.txt
ENTRYPOINT ["main.py"]

但是,当通过 PyCharm 的自动 docker 集成运行时,testlogs 目录都被复制到容器中。 PyCharm 运行命令的结果如下:
7eb643d9785b:python -u /opt/project/main.py

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

想知道 PyCharm 的 /opt/project 是否有可能以某种方式干扰?那么 在这样的项目中究竟应该在哪里 .dockerignore 呢?

更新

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

python - .dockerignore 放在哪里?-LMLPHP

最佳答案

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

        {
            "Type": "bind",
            "Source": "/home/adam/Desktop/Dev/ec2-data-analysis/grimlock",
            "Destination": "/opt/project",
            "Mode": "rw",
            "RW": true,
            "Propagation": "rprivate"
        },

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

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

对于将来遇到此问题的任何人,.dockerignore 需要位于构建上下文的根目录中。构建上下文是您在构建命令结束时传递的目录,通常是 . 或当前目录。如果您启用 BuildKit,它将 first check for a Dockerfile.dockerignore 可以更改您的 Dockerfile 路径/名称。要测试您的 .dockerignore ,请参阅 this answer

关于python - .dockerignore 放在哪里?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60713751/

10-11 15:11