我正在尝试将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看起来非常适合在应用程序完成后打包它,但是不太适合用作开发环境。重建容器需要很长时间,因此浪费了大量时间。
我很欣赏任何见解。谢谢。
答案 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包分发问题。