【问题标题】:Docker compose installing requirements.txtDocker compose 安装 requirements.txt
【发布时间】:2018-11-03 00:21:08
【问题描述】:

在我的 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

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

【问题讨论】:

    标签: python git docker docker-compose


    【解决方案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
    

    【讨论】:

      【解决方案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 应用服务器替换。

      更新:

      带 cmets 聊天后,发现使用exec 运行命令很重要,而不是像这样在入口点脚本的末尾运行它:

      python3 manage.py runserver 0.0.0.0:8000
      

      我不记得为什么它很重要,但我之前也遇到过这个问题。您需要执行该命令,否则它将无法正常工作。

      【讨论】:

      • 不错的解决方案。安装所有要求后,服务器似乎永远不会启动。似乎没有日志被转储到标准输出。
      • 请注意,脚本更改为 /home/app 目录 - 也许这不是您的 manage.py 所在的位置?您的 Dockerfile 没有显示 WORKDIR,所以我不确定图像的假设。也许您只需要在运行 exec 之前在其他地方 cd
      • WORKDIR 设置为 /home/app。通过在入口点脚本中运行“ls”来确认它。似乎位于正确的位置。
      • @RobertChristopher 哎呀!我忘记了重要的一点……您需要在 Dockerfile 中设置ENTRYPOINT。查看更新的答案。
      • 我应该在撰写文件中指定入口点吗?谢谢。
      猜你喜欢
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      相关资源
      最近更新 更多