制作一个依赖关系容器并将其卷挂载到其他容器上

时间:2018-11-15 16:40:46

标签: docker dockerfile

我遇到一个问题,就是我的容器变得太重,其中许多容器具有很多相同的依赖关系。

我想制作一个基本容器,该容器将安装并保存所有依赖项,然后使其他容器指向该基本容器上的依赖项目录(使用卷)。

我正在尝试对此做一个小的POC,我首先尝试让一个容器安装python软件包,然后让另一个容器使用该模块运行python脚本。

我想在主机上建立一个目录,该目录将挂载在所有容器上,并将包含所有需要的数据和依赖项。

我应该注意,即使这样做可能更好,我也无法使用docker compose。

这是我的基本容器的Dockerfile:

FROM python:3.6-slim

RUN apt-get update && apt-get install -y vim

RUN pip install --install-option="--prefix=/volumes/shared/dependencies" deepdiff 

CMD tail -f /dev/null

您会看到pip将安装到/volumes/shared/dependencies目录中。

我这样运行:

docker build -t base_container .
docker run -ti -v "$PWD/shared/base_dependencies":/volumes/shared/dependencies base_container

现在,如果我进入/volumes/shared/dependencies的容器,我会看到放置在主机目录中的文件,但看不到已安装的软件包。另一方面,如果主机目录为空,则会看到已安装的软件包。

我还尝试应用2个卷(其中一个用于输入文件,另一个用于容器将创建的文件)

在这种情况下,我如何获得双向销量,所以对这种情况的发生原因进行解释也很好。

2 个答案:

答案 0 :(得分:1)

对卷执行import os import sys sys.path.append(os.path.abspath(os.path.dirname(__file__))) from foo.bar import Bar 时,它将首先在主机上创建目录(如果该目录不存在),然后装入该卷,从而进行读取。所以事情是,容器中的目标目录将被主机上的目录替换,从而导致目录为空。

只需在“运行时”中复制依赖项,并且您不再需要使用docker run的容器

tail -f

答案 1 :(得分:0)

您可以采用的一种有效的方法是构建包含依赖项的通用基础图像 ,然后在此基础上构建应用程序。我将使用多阶段Dockerfile语法进行演示,但是您可以对完全独立的基础映像执行类似的操作。

FROM python:3 AS base
RUN pip3 install numpy \
 && pip3 install scipy

FROM base
WORKDIR /app
COPY requirements.txt ./
RUN pip3 install -r requirements.txt
COPY . ./
CMD ["./myscript.py"]

如果您有多个都需要相同大型基础库的应用程序,则可以FROM都构建相同的基础映像,并且它们将共享该映像中的层。 (在某种程度上取决于您的存储库设置。)如果随后更新了基础映像,则必须在其之上重建应用程序,但是同时,可以保护未更新的内容免受其下的意外更改的影响。他们。

不要通过卷共享代码。尤其是,完全不具有映像的运行能力取决于该映像无法控制的某些外部资源。这打破了Docker的隔离点。

作为基于卷的方法出现问题的最小示例:

docker run -d -v ./site-packages:/usr/local/lib/python3/site-packages ...
rm -rf site-packages/some-lib
# what now?