Skip to main content
 首页 » 编程设计

python之有没有一种简单的方法可以将目录的特定部分复制到 Dockerfile 中

2024年08月12日37小虾米

假设我的包结构如下所示:

. 
├── 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 . .