Docker撰写安装requirements.txt

时间:2016-12-29 14:09:38

标签: python git docker docker-compose

在我的docker镜像中,我正在克隆git master分支以检索代码。我正在使用docker-compose进行开发环境并使用卷运行我的容器。我从python requirements.txt文件安装新的项目需求时遇到了一个问题。在开发环境中,它永远不会在开发环境中安装新的需求,因为在重新构建映像时,最新的代码是从github中提取的。

以下是我的dockerfile示例:

FROM base

# Clone application
RUN git clone repo-url
# Install application requirements
RUN pip3 install -r app/requirements.txt

# ....

这是我的撰写文件:

myapp:
    image: development
    env_file: .env
    ports:
        - "8000:80"
    volumes:
        - .:/home/app

    command: python3 manage.py runserver 0.0.0.0:8000

有没有办法在构建开发后安装新添加的需求?

2 个答案:

答案 0 :(得分:2)

有两种方法可以做到这一点。

手工

您可以输入容器并自行完成。缺点:不是自动化的。

$ docker-compose exec myapp bash
2912d2cd9eab# pip3 install -r /home/app/requirements.txt

使用入口点脚本

您可以使用运行准备工作的入口点脚本,然后运行命令。

<强> Dockerfile:

COPY entrypoint.sh /entrypoint.sh
RUN chmod 755 /entrypoint.sh

# ... probably other stuff in here ...

CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"]
ENTRYPOINT ["/entrypoint.sh"]

<强> entrypoint.sh:

#!/bin/sh

cd /home/app
pip3 install -r requirements.txt

# May as well do this too, while we're here.
python3 manage.py migrate

exec "$@"

在容器启动时,入口点就像这样运行:

/entrypoint.sh $CMD

扩展为:

/entrypoint.sh python3 manage.py runserver 0.0.0.0:8000

首先运行准备工作,然后在入口点脚本的末尾,执行传入的参数。这是你的命令,所以entrypoint.sh退出并被你的Django应用服务器取代。

<强>更新

在评论聊天之后,我们发现使用exec运行命令非常重要,而不是在入口点脚本的末尾运行它,如下所示:

python3 manage.py runserver 0.0.0.0:8000

我不能完全回想起为什么这很重要,但我之前也遇到了这个问题。你需要执行命令,否则它将无法正常工作。

答案 1 :(得分:1)

我解决此问题的方法是运行两个服务:

  1. 服务器:根据要求运行服务器
  2. 要求:在运行服务器之前先安装要求

这是docker-compose.yml文件的样子:

version: '3'

services:
  django:
    image: python:3.7-alpine
    volumes:
     - pip37:/usr/local/lib/python3.7/site-packages
     - .:/project
    ports: 
      - 8000:8000
    working_dir: /project
    command: python manage.py runserver
    depends_on:
      - requirements

  requirements:
    image: python:3.7-alpine
    volumes:
      - pip37:/usr/local/lib/python3.7/site-packages
      - .:/project
    working_dir: /project
    command: pip install -r requirements.txt

volumes:
  pip37:
    external: true

PS:我为pip模块创建了一个命名卷,以便可以在不同项目中保留它们。您可以通过运行以下命令自己创建一个:

docker volume create mypipivolume