Как редактировать код в контейнере Docker в разработке?
У меня есть код всех моих сайтов под /srv
в моих контейнерах.
My Dockerfile загружает код с помощью git и делает его частью изображения для упрощения развертывания в процессе производства.
Но как мне изменить код в разработке? Я думал, что использование томов было решением, например: -v /docker/mycontainer/srv:/srv
. Но он перезаписывает каталог в контейнере. Если это первый раз, когда я запускаю его, он опустошает его, потому что в хосте нет ничего. Так что все, что я делал в Dockerfile, терялось.
Есть также каталоги и файлы внутри /srv/myapp
, которые я хочу использовать в разных версиях моего приложения, например: /srv/myapp/user-uploads
. Это обычная практика в профессиональной веб-разработке.
Итак, что я могу сделать, чтобы иметь возможность делать все это?
- изменить код в /srv в разработке
- share/srv/myapp/user-uploads в разных версиях
- пусть Dockerfile загружает код. Выполнение "git clone" или "git pull" за пределами Docker, по моему мнению, победит цель Docker. Кроме того, есть вещи, которые я не могу запустить на хосте, такие как миграции базы данных или другие скрипты, специфичные для приложения.
Есть ли способ сделать обратную громкость? Я имею в виду, что контейнер переписывает хост вместо противоположного.
Я думаю, что один soluiton мог бы скопировать /srv в/srv.deployment-copy перед запуском демонстратора контейнера. И затем, когда я запустил демон, проверьте, существует ли /srv.deployment-copy и копирует все обратно в /srv. Таким образом, я могу использовать /srv в качестве тома и все еще иметь возможность развернуть код с помощью Dockerfile. Я уже использую псевдонимы для всех команд докеров, поэтому автоматизировать это не будет проблемой. Как вы думаете?
Ответы
Ответ 1
Я нашел, что лучший способ редактировать код в разработке - установить все как обычно (включая клонирование вашего репозитория приложений), но переместите весь код в контейнере, чтобы сказать /srv/myapp.deploy.dev
. Затем запустите контейнер с томом rw
для /srv/myapp
и init.d script, который очистит этот том и скопирует его содержимое следующим образом:
rm -r /srv/myapp/*
rm -r /srv/myapp/.[!.]*
cp -r /srv/myapp.deploy.dev/. /srv/myapp
rm -r /srv/myapp.deploy.dev
Ответ 2
Существует другой способ запустить контейнер с томом из другого контейнера:
Посмотрите
https://docs.docker.com/userguide/dockervolumes/
Создание и установка контейнера объема данных
Если у вас есть постоянные данные, которые вы хотите разделить между контейнерами или хотите использовать из непостоянных контейнеров, лучше всего создать именованный контейнер тома данных, а затем смонтировать данные из него.
Создайте новый именованный контейнер с разделяемым томом.
$ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres
Затем вы можете использовать флаг --volumes-from для монтирования тома /dbdata в другом контейнере.
$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres
И еще:
$ sudo docker run -d --volumes-from dbdata --name db2 training/postgres
Еще одна полезная функция, которую мы можем выполнять с томами, - использовать их для резервного копирования, восстановления или миграции. Мы делаем это, используя флаг --volumes-from для создания нового контейнера, который монтирует этот том, например:
$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
=============
Я думаю, вы не должны использовать установку вашего каталога хоста в контейнер.
Но вы можете использовать тома со всеми его возможностями.
Вы можете редактировать файлы в томах с помощью других контейнеров с идеальным набором ваших редакторов и инструментов. И контейнер это ваше приложение будет чистым без накладных расходов.
Структура:
-) Контейнер для данных приложения
docker run -d -v /data --name data
-) Контейнер для бинарных файлов приложений
docker run -d --volumes-from data --name app1
-) Контейнер для редакторов и утилит для разработки
docker run -d --volumes-from data --name editor
Ответ 3
Примечание. Вы не можете подключить каталог контейнера к каталогу хоста с помощью -v
.
Я не думаю, что вам нужно mangle/srv и /srv.deployment-copy. Если вы
Я думаю, что:
-
Вы должны использовать объем для постоянных/общих данных: -v /hostdir/user-uploads:/srv/myapp/user-uploads
, или вы можете использовать контейнер объема данных. Вы можете рассмотреть эту базу данных с резервной копией файловой системы, которая хранится на узле (только контейнер данных), и контейнеру разрешено использовать его -v
.
-
Вы правы: для производственного развертывания - вы можете создать изображение с исходным кодом (git clone
), вы создаете образ для каждой версии. Не должно быть необходимости редактировать исходный код в процессе производства.
-
для среды разработки - вы должны создать образ без исходного кода или вы можете затенять каталог исходного кода томом в случае использования одного и того же изображения для развертывания/разработки. Затем git исходный код клонирования локально и использовать том -v /hostdir/project/src:/srv/project
для обмена исходным кодом с контейнером. Желательно, чтобы исходный код был доступен только для чтения (:ro
в конце), и любые временные или промежуточные файлы должны храниться где-то еще в контейнере. У меня есть установочные сценарии (перенос данных, перестройка некоторых файлов данных индекса/кеша и т.д.), Выполняемых при запуске контейнера, до запуска службы. Поэтому всякий раз, когда я чувствую, что мне нужен свежий re-init
, я просто убиваю контейнер dev и запускаю его снова. Или я не останавливаю старый контейнер - я просто запускаю еще один.
Ответ 4
Я нашел хороший способ сделать это, используя только git:
CONTAINER=my_container
SYNC_REPO=/tmp/my.git
CODE=/var/www
#create bare repo in container
docker exec $CONTAINER git init --bare $SYNC_REPO
#add executable syncing hook that checks out into code dir in container
printf "#!/bin/sh\nGIT_WORK_TREE=$CODE git checkout -f\n" | \
docker exec -i $CONTAINER bash -c "tee $SYNC_REPO/hooks/post-receive;chmod +x \$_"
#use git-remote-helper to use docker exec instead of ssh for git
git remote add docker "ext::docker exec -i $CONTAINER sh -c %S% $SYNC_REPO"
#push updated local code into docker
git push docker master
Предполагается, что у вас есть локальный код git с кодом. git необходимо установить в контейнер. В качестве альтернативы вы могли бы использовать docker run
и контейнер данных с общим томом с установленным git.
Ответ 5
Предполагая, что git не является точкой входа контейнера, если git установлен в вашем контейнере докера, вы можете ssh в контейнер и запустить git clone
/git pull
. Из-за того, как общий том совместно с хостом, изменения, сделанные из контейнера в файлы, также будут сделаны на хост (действительно, это одни и те же файлы).
Здесь есть некоторое объяснение того, как быстро ssh в контейнер.