#docker
#docker
Вопрос:
Я создаю свой проект следующим образом Dockerfile
:
FROM ubuntu:14.04
#"updating package repos.."
RUN apt-get update
#"installing required packages.."
RUN apt-get -y install python2.7-dev build-essential python-pip
run apt-get -y install libjpeg-dev libpng3 libpng12-dev
run apt-get -y install nodejs npm nodejs-legacy
run npm install -g peer
run apt-get -y install supervisor
#"creating sites folder under /opt"
run mkdir /opt/sites
#"copying project into /opt/sites"
add project-latest /opt/sites/project-latest
#"copying supervisor conf into /etc/supervisor/conf.d"
add etc/project.conf /etc/supervisor/conf.d/
#"installing virtualenv"
run pip install virtualenv
#"change working dir to /opt/sites/project-latest"
workdir /opt/sites/project-latest
#"create vritualenv folder named 'env' "
run virtualenv env
#"activating environment"
run . env/bin/activate
#"installing packages into env from requirements.txt"
run pip install -r requirements.txt
#"syncing DB"
run python manage.py syncdb
#"migrating DB"
run python manage.py migrate
#"update and restart supervisorctl"
run service supervisor start
cmd supervisorctl reread
cmd supervisorctl update
cmd supervisorctl restart all
#"expose 8000 and 9000 ports"
expose 8000
expose 9000
И это конечный результат процесса сборки:
Successfully built 29dbd8e8bb0a
Removing intermediate container 8a20545921e0
Removing intermediate container 0da63841f6ad
Removing intermediate container fab164fe93c2
Removing intermediate container 77b61eceef36
Removing intermediate container 87a24b079f47
Removing intermediate container cb2520749e30
Removing intermediate container 9e9c54376433
Removing intermediate container 130f6eaeed6a
Removing intermediate container 56f9d93a1e75
Removing intermediate container 599b10008caa
Removing intermediate container eab7598a5e95
Removing intermediate container c31b58fcc405
Removing intermediate container 8b4a55fbb345
Removing intermediate container 13b35d86044e
Removing intermediate container 0ab10eef8f5e
Removing intermediate container ebf42d9493f1
Removing intermediate container 70c772c4aa73
Removing intermediate container fe5039bfbe15
Removing intermediate container 8f9a93cd5438
Removing intermediate container 2d673cf029f8
Removing intermediate container ab8485d09ee7
Removing intermediate container 0fdfa200ac27
Removing intermediate container d2d02358e25d
Если я создаю контейнер для запуска bash
внутри моего созданного образа, я вижу, что некоторые шаги сборки забыты. т.Е. с моим файлом нет виртуальной среды requirements.txt
.
И я понятия не имею, как открыть мое запущенное Django
приложение с моего хост-компьютера. Также нет никаких портов или информации об IP.
Ответ №1:
Удаление промежуточных образов — это нормально. Если вы хотите сохранить их, вам придется добавить --rm=false
в свою команду сборки.
Есть несколько проблем с вашим Dockerfile. Для начала CMD
вступит в силу только последнее (вот документы).
Кроме того, эта строка выглядит подозрительно:
run . env/bin/activate
Я предполагаю, что это предназначено для настройки некоторых переменных среды, но я не думаю, что так работает docker. Я думаю, что либо вам нужно использовать ENV
команду, либо вам придется запускать эту и следующие команды вместе:
run . env/bin/activate; pip install -r requirements.txt; python manage.py syncdb; python manage.py migrate
Что касается портов, вы запускаете образ с -p
-P
параметрами или?
Комментарии:
1. Вы уверены? Я думаю, что после прочтения синтаксиса это
--rm=true
приведет к их удалению, а не к их сохранению. Будут ли эти промежуточные изображения по-прежнему отображатьсяdocker images -a
, даже если они были удалены? РЕДАКТИРОВАТЬ: docs.docker.com/reference/commandline/cli/#build Похоже, это кэшированные промежуточные шаги: docs.docker.com/reference/commandline/cli/#images2. Да, глупая ошибка, так и должно быть
--rm=false
. Также я не помню, какая версия docker была актуальна тогда, но я думаю, что это было до версии 1.0, поэтому некоторые параметры и значения по умолчанию могли измениться за это время.3.
. env/bin/activate
не устанавливает переменные среды. Это активирует виртуальную среду python. Выполнение этого как отдельного шага запуска должно работать нормально.4. Или используйте
--no-rm
, если вы используете docker-compose5. Могу ли я установить значение
--rm=false
или--no-rm
по умолчанию вdocker-compose
файле, чтобы я мог просто запуститьdocker-compose up
и в итоге сохранить все свои контейнеры? Я не смог найти ни одного варианта.