【问题标题】:Where to put .dockerignore?在哪里放置 .dockerignore?
【发布时间】:2020-06-28 00:35:38
【问题描述】:

考虑以下典型的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 集成运行时,test 和 logs 目录都被复制到容器中。 PyCharm 运行命令结束如下:

7eb643d9785b:python -u /opt/project/main.py 

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

COPY . /app/
COPY .dockerignore .dockerignore
WORKDIR /app

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

更新

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

【问题讨论】:

  • 如果你在dockerignore中有/logs,用logs或者logs/替换它
  • 谢谢,但我已经把它作为logs/ 了
  • 它们是包含在构建的映像中,还是仅通过卷可用?为您的容器 ID/名称包括 docker container inspect 输出。
  • @BMitch 谢谢 - 所以我确实运行了这个命令,但是因为它可能包含敏感信息而犹豫是否要在 SO 上发帖。我具体在寻找什么?如果你愿意,我可以 PM 给你
  • 在非敏感环境中重新创建问题并发布整个内容。任何 IP 地址都是不可路由的/内部的。

标签: python docker pycharm


【解决方案1】:

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

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

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

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


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

【讨论】:

    猜你喜欢
    • 2011-06-29
    • 2018-03-27
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    相关资源
    最近更新 更多