将python依赖项添加到Docker容器的好方法是什么?

时间:2015-07-05 00:51:04

标签: python django docker pip docker-compose

我正在尝试将docker集成到我的django工作流程中,除了一个非常烦人的问题之外,我已经完成了所有设置。如果我想在我的requirements.txt文件中添加依赖项,我基本上只需要重建整个容器映像以保持这些依赖项。

例如,我按照django here的docker-compose示例。 yaml文件设置如下:

db:
  image: postgres
web:
  build: .
  command: python manage.py runserver 0.0.0.0:8000
  volumes:
    - .:/code
  ports:
    - "8000:8000"
  links:
    - db

用于构建Web容器的Docker文件设置如下:

FROM python:2.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/

因此,当为此容器构建映像时,requirements.txt将安装其中最初的依赖项。

如果我使用它作为我的开发环境,那么很难将任何新的依赖项添加到requirements.txt文件中,因为我将不得不重新构建容器以便安装requirements.txt中的更改。

django社区是否有某种最佳实践可以解决这个问题?如果没有,我会说Docker看起来非常适合在应用程序完成后打包它,但是不太适合用作开发环境。重建容器需要很长时间,因此浪费了大量时间。

我很欣赏任何见解。谢谢。

3 个答案:

答案 0 :(得分:3)

使用requirements.txt时,您可以将docker run作为卷装入(未经测试,但您可以获得要点):

docker run container:tag -v /code/requirements.txt ./requirements.txt

然后,您可以在启动应用程序之前将脚本与容器捆绑在一起,然后将其用作pip install -r requirements.txt。我喜欢自定义入口点脚本方法,它让我可以做一些额外的工作,而无需制作新的容器。

也就是说,如果您正在更改您的依赖项,那么您可能正在更改您的应用程序,您可能应该创建一个新容器并使用更高版本标记它,不是吗? :)

答案 1 :(得分:3)

所以我将yaml文件更改为:

#!/bin/bash

#restart this script as root, if not already root
[ `whoami` = root ] || exec sudo $0 $*

pip install -r dev-requirements.txt

python manage.py runserver 0.0.0.0:8000

我创建了一个简单的shell脚本startup.sh:

Syntax error: File to import not found or unreadable: foundation/functions.
          Load paths:
            C:/Users/Name/Desktop/Test-1/scss
            C:/Program Files (x86)/Prepros/gems/gems/bourbon-4.0.2/app/assets/stylesheets
            C:/Program Files (x86)/Prepros/gems/gems/neat-1.6.0/app/assets/stylesheets
            C:/Program Files (x86)/Prepros/gems/gems/bitters-0.10.0/app/assets/stylesheets
            C:/Users/Name/Desktop/Test-1/scss/sass
            C:/Program Files (x86)/Prepros/gems/gems/compass-core-1.0.0.alpha.19/stylesheets
            Compass::SpriteImporter
    on line 58 of _settings.scss
    from line 1 of app.scss
  Use --trace for backtrace.

C:\Users\Name\Desktop\Test-1\scss\app.scss

然后创建一个dev-requirements.txt,它由上面的shell脚本安装为一个依赖的staging环境。

当我对dev-requirements.txt中的依赖项感到满意时,我将把它移到requirements.txt,以提交给下一次构建的图像。这使我可以灵活地在开发时添加和删除依赖项。

答案 2 :(得分:0)

我认为最好的方法是忽略目前安装python依赖项(awk)的最常用方法,并直接在Dockerfile中指定您的需求,有效地删除pip install -r requirements.txt文件。此外,您可以免费获得dockers图层缓存。

requirements.txt

如果docker容器是运行应用程序的唯一方式,那么我建议你这样做。如果您想支持其他设置代码的方法(例如virtualenv),那么这当然不适合您,您应该回到使用需求文件或使用setup.py例程。无论哪种方式,我发现这种方式最简单直接,而不会处理所有混乱的python包分发问题。