假设我的包结构如下所示:
.
├── mypackage
│ ├── ignore_this_subpackage
│ │ ├── __init__.py
│ │ └── ignore_me.py
│ ├── include_this_subpackage
│ │ ├── __init__.py
│ │ └── shared_library.py
│ └── my_main_subpackage
│ ├── __init__.py
│ └── main.py
├── __init__.py
├── Dockerfile
└── requirements.txt
假设我的 Dockerfile 看起来像这样:
FROM python:3.7-slim
RUN mkdir -p /opt/mypackage
COPY mypackage/ /opt/mypackage/
ENV PYTHONPATH="/opt/$PYTHONPATH"
WORKDIR /opt/mypackage/my_main_subpackage
ENTRYPOINT ["python", "main.py"]
如您所见,我正在复制 mypackage 中的所有内容。但是,我真的只需要两个嵌套目录。理想情况下,我想排除某些子模块。但是因为 main.py 引用了另一个共享库及其完全限定的模块名称,所以我确实需要保留完整的目录结构。
在这个简化的示例中,使用多个 COPY 语句手动复制单个文件和文件夹会非常容易。但实际上,这实际上代表了一个更大的项目,其中的文件太多以至于不可行。
我想知道是否还有其他人想出任何优雅的解决方案来解决这个问题?我想过运行两次调用 mkdir -p 来创建嵌套的子目录,然后只使用两个 COPY 语句来复制我需要的文件。然而,这个问题是我仍然需要在每个目录级别都有空白的 __init__.py 文件,否则导入将失败。而且我不知道有什么实用程序可以用空白的 __init__.py 文件为树中的每个目录播种。
有什么方法可以执行稍微复杂一些的 COPY 命令,该命令可以排除某些目录,或者只包含某些匹配项,等等?谢谢。
请您参考如下方法:
来自documentation .dockerignore,您可以在目录的根目录下使用此文件来告诉 docker 不要复制所有内容。
你的目录结构看起来像这样
.
├── mypackage
│ ├── ignore_this_subpackage
│ │ ├── __init__.py
│ │ └── ignore_me.py
│ ├── include_this_subpackage
│ │ ├── __init__.py
│ │ └── shared_library.py
│ └── my_main_subpackage
│ ├── __init__.py
│ └── main.py
├── __init__.py
├── Dockerfile
|──.dockerignore
└── requirements.txt
并且您的 .dockerignore 文件将包含您需要忽略的内容
ignore_this_subpackage
然后 Dockerfile 中的 COPY 命令看起来像
COPY . .
