Docker - pip在docker.compose上安装共享卷中的所有requirements.txt文件

时间:2018-04-21 13:20:02

标签: docker pip docker-compose docker-volume

我正在尝试使用docker-compose与其他容器共享python模块,确保这些容器都安装了100%的requirements.txt文件pip。

我已经能够使用卷与其他容器共享共享的python模块(在/ src / shared-modules)。但是,我正在努力实现自动安装' / src / shared-modules中找到的所有requirements.txt文件。

Dockerfile如下所示:

FROM python:3.6.5

COPY . /src

**#Run pip install on all found requirements.txt files in the container**
RUN for req in `find . -name requirements.txt -type f`; do pip install --trusted-host pypi.org -r $req; done

WORKDIR /src

这适用于复制到容器的主机文件夹中的所有内容,但不适用于/ src / shared-modules文件夹中的任何内容。也许它们在dockerfile中运行pip install命令时还不存在,或者它们还没有被链接到源共享模块容器?

docker-compose.yaml看起来像这样:

  db:
    image: tutum/mongodb

  shared-modules:
    build: ./shared-modules
    volumes:
      - "shared-modules:/src/shared-modules"

  web:
    build: ./django-site
    entrypoint: "python manage.py runserver 0.0.0.0:8000"
    volumes:
      - "shared-modules:/src/shared-modules"


volumes:
  shared-modules:

我尝试将pip install添加到docker-compose-yaml文件中的entrypoint + command命令,如下所示:

  web:
    build: ./django-site
    entrypoint: /bin/bash
    command: "for req in `find /src/shared-modules -name requirements.txt -type f`; do pip install --trusted-host pypi.org -r $req; done && python manage.py runserver 0.0.0.0:8000"
    volumes:
      - "shared-modules:/src/shared-modules"

我希望这会在已创建的容器上运行命令,该容器已链接到共享模块容器,但/ src / shared-modules的requriemtns.txt文件未安装在docker-compose上。

  

for find . -name requirements.txt -type f中的req;做pip安装   --trusted-host pypi.org -r $ req;完成

命令有效但只有在创建后附加到正在运行的容器并手动执行它。我真的希望将其作为docker-compose进程的一部分进行自动化。

如果在作为docker-compose up过程的一部分分配卷后,如何在容器上执行bash命令?

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

我真的没有在这里得到你的一般方法 如果你想确保所有容器都安装了所有的python软件包,那就安装它们通常'在Dockerfile中运行 pip install -r requirements.txt 也许想想所有容器共享的基础Dockerfile 这可能包括所有安装。

你的音量方法看起来非常h​​acky。可能不值得让它发挥作用。

答案 1 :(得分:0)

即使Docker的文档中也有一些有关Saskia提及的Dockerfile方法的示例,但我认为您的原始方法没有任何问题。对于小型项目而言,Dockerfile方法可能很简单,但是当构建包含多个服务的更大类型的基础架构时,使用卷挂载更为明确和易读。但这当然取决于用例。

我喜欢做多个.yml文件,例如build.yml,其中可能具有与主docker-compose.yml中相同的服务。这些服务将自行安装需求,或者安装所需做的逻辑。我可以通过运行docker-compose -f build.yml up使用build.yml,然后喝杯咖啡,观察整个系统如何同时建立。之后,docker-compose up应该可以正常工作,因为已经安装了需求。