代码之家  ›  专栏  ›  技术社区  ›  NotSoShabby

生成依赖容器并将其卷装载到其他容器上

  •  1
  • NotSoShabby  · 技术社区  · 7 年前

    我有一个问题,我的容器变得太重,他们中的许多有很多相同的依赖性。

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

    我试图对此做一个小的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
    

    现在如果我进入容器 /卷/共享/依赖项 我看到了我放在主机目录中的文件,但没有看到安装的包。另一方面,如果主机目录为空,我会看到已安装的包。

    我还尝试应用两个卷(一个用于进入的文件,另一个用于容器将创建的文件)

    在这种情况下,我怎样才能得到一个双向音量,解释为什么会发生这种情况也会很好。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Siyu Zeeshan Akhter    7 年前

    当你这样做的时候 docker run 有了音量,它就会 第一 在主机上创建目录(如果不存在),然后装入卷,然后读取它。所以问题是,容器中的目标目录将被主机上的目录替换,从而导致一个空目录。

    只需在“运行时”复制依赖项,就不再需要容器 tail -f

    FROM python:3.6-slim
    
    RUN apt-get update && apt-get install -y vim
    
    RUN pip install --install-option="--prefix=/temp" deepdiff 
    
    CMD cp -pr /temp /volumes/shared/dependencies
    
        2
  •  0
  •   David Maze    7 年前

    你可以采取的一种有效的方法是建立一个共同的基础 形象 它包含您的依赖项,然后在此基础上构建应用程序。我将使用多级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?