我有一个项目,其中有一些大文件和文件夹。有些文件大部分是静态的(* .params)。现在,我希望将静态文件/文件夹发布为独立的层。下面是我的项目结构。
/app
/static_files
/a.params
/b.params
/dynamic1.py
/dynamic2.py
/static_folders
/dynamic1.py
/dynamic2.py
/dynamic3.py
/folder1
/dynamic1
/dynamic.py
/dynamic2
/dynamic.py
run.py
requirements.txt
Dockerfile是FROM nvidia/cuda:10.1-devel as base
WORKDIR /app
RUN apt update && apt install python3-pip -y && rm -rf /var/lib/apt/lists/*
RUN pip3 install --upgrade pip
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY . .
RUN make
CMD ["python3","run.py"]
实际上,我在run.py中修改了一些代码然后将其发布,用户应拉取300MB以上的镜像。提前致谢。
最佳答案
如果我理解正确,那么您想利用Docker层来减少发布容器更新时需要提取的字节。
为了实现这一点,您应该分割图层,以使静态(可能很大)文件相对于动态(可能很小)文件位于单独的层中。
您可以通过拥有一个专用的static
文件夹并发出2个单独的COPY
来实现此目的:一个用于静态目录,另一个用于其他所有内容(请注意排除静态目录本身!)。
鉴于您当前的结构将静态和动态资源混合在一起,这会有点麻烦,因为您不能仅使用COPY
和整个文件夹并使用它来完成。在您的情况下,命令应类似于:
# Preparing layers for static resources
COPY static_files/*.param static_files/
COPY static_folders/folder* static_folders/
# Copying the rest of the resources
COPY static_files/*.py static_files/
COPY static_folders/*.py static_folders/
COPY dynamic* run.py requirements.txt .
但是,这非常笨拙且容易出错(当您添加带有新名称模式的新静态资源时,您很容易忘记调整Dockerfile),并且还会导致一堆层,而不是仅两个不同的静态层与动态层。因此,从长远来看,更改项目结构是否可以作为一项有值(value)的投资可能值得评估。
关于python - Dockerfile,如何减小更改层的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63844151/