2015-07-05 4 views
5

Я пытаюсь интегрировать docker в свой рабочий процесс django, и у меня есть все настроенное, за исключением одной действительно раздражающей проблемы. Если я хочу добавить зависимости к моему файлу requirements.txt, мне просто нужно перестроить весь образ контейнера для этих зависимостей.Что такое хороший способ добавления зависимостей python к контейнеру Docker?

Например, я выполнил пример docker-compose для django here. файл YAML устанавливается следующим образом:

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

и файл 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/ 

Итак, когда изображение строится для этого контейнера требованиям. txt устанавливается с любыми зависимостями изначально в нем.

Если я использую это как свою среду разработки, становится очень сложно добавить любые новые зависимости к этому файлу требований.txt, потому что мне придется перестроить контейнер для изменений в файле требований. Txt.

Есть ли какая-то лучшая практика в сообществе джанго, чтобы справиться с этим? Если нет, я бы сказал, что докер выглядит очень красиво для упаковки приложения после его завершения, но не очень хорошо используется в качестве среды разработки. Это займет много времени, чтобы восстановить контейнер, поэтому много времени тратится впустую.

Я ценю любое понимание. Благодарю.

ответ

3

Вы можете установить requirements.txt как объем при использовании docker run (непроверенной, но вы получите суть):

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

Тогда вы могли бы расслоение скрипта с вашим контейнером, который будет работать pip install -r requirements.txt перед запуском приложения, и используйте это как ваш ENTRYPOINT. Мне нравится пользовательский подход к сценарию входа, он позволяет мне сделать небольшую дополнительную работу без необходимости создания нового контейнера.

При этом, если вы меняете свои зависимости, вы, вероятно, меняете свое приложение, и вы, вероятно, должны создать новый контейнер и пометить его более поздней версией, нет? :)

+0

Да, хорошая идея. Я мог бы просто установить его зависимости при запуске контейнера. Я собираюсь попробовать. –

+1

@SpencerCooley В зависимости от количества зависимостей, которые у вас есть, вы можете захотеть, чтобы в контейнере были те, которые, как вы знаете, у вас всегда есть, а затем просто добавьте возможность добавлять больше. Вы не хотите, чтобы контейнер заработал несколько минут. – 2rs2ts

+0

true, поэтому базовое изображение будет иметь все основы, а сценарий запуска будет устанавливать зависимости, которые я использую во время процесса разработки, например, своего рода список временных зависимостей. Когда я готов все это вытащить, я могу просто переместиться над зависимостями, которые, как я решаю, будут постоянными в системе. Иногда я просто экспериментирую с библиотеками, которые я не использую. Это похоже на среду зависимостей dev. final_requirments.txt temp_requirements.txt –

3

Так что я изменил файл YAML на это:

db: 
    image: postgres 
web: 
    build: . 
    command: sh startup.sh 
    volumes: 
    - .:/code 
    ports: 
    - "8000:8000" 
    links: 
    - db 

Я сделал простой сценарий оболочки Startup.sh:

#!/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 

, а затем сделал Dev-requirements.txt, который установленный вышеуказанным сценарием оболочки как своего рода среда промежуточной среды.

Когда я доволен зависимостью в dev-requirements.txt, я просто переведу его в файл requirements.txt, чтобы быть привязанным к следующей сборке изображения. Это дает мне возможность играть с добавлением и удалением зависимостей во время разработки.

0

Я думаю, что лучший способ - игнорировать то, что в настоящее время является наиболее распространенным способом установки зависимостей на основе python (pip install -r requirements.txt) и указать ваши требования непосредственно в файле Docker, эффективно избавляясь от файла requirements.txt. Кроме того, вы получаете бесплатное кэширование уровня докеров.

FROM python:2.7 
ENV PYTHONUNBUFFERED 1 
RUN mkdir /code 
WORKDIR /code 
# make sure you install requirements before the ADD, since everything after ADD is not cached 
RUN pip install flask==0.10.1 
RUN pip install sqlalchemy==1.0.6 
... 
ADD . /code/ 

Если контейнер докер является единственным способом ваше приложение никогда не запустится, то я хотел бы предложить вам сделать это таким образом. Если вы хотите поддерживать другие способы настройки своего кода (например, virtualenv), то это, конечно, не для вас, и вы должны вернуться к использованию файла требований или использовать процедуру setup.py. В любом случае, я нашел этот способ самым простым и понятным, не имея дело со всеми проблемами распространения пакетов python.

+0

Я мог ошибаться, но я думаю, что этот подход ошибочен тем, что он не гарантирует, что кто-то другой, кто строит этот файл докере, получит те же версии библиотек. то есть он не создает воспроизводимую сборку. – jshen

+0

Некоторое время назад я использовал докер таким образом. Можете ли вы уточнить? –

Смежные вопросы