Как редактировать код в контейнере 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. Кроме того, есть вещи, которые я не могу запустить на хосте, например миграции базы данных или другие скрипты для конкретных приложений.
есть ли способ сделать обратное крепление Тома? Я имею в виду сделать контейнер перезаписать хост, а не наоборот.
Я думаю, что одним из решений может быть копирование /srv в /srv.развертывание-копирование перед запуском демона контейнера. А потом, когда я запустите демон проверить, если /srv.развертывание-копия существует и копирует все обратно в /srv. Таким образом, я могу использовать /srv в качестве Тома и по-прежнему иметь возможность развертывать код на нем с помощью Dockerfile. Я уже использую псевдонимы для всех команд docker, поэтому автоматизация этого не будет проблемой. А ты как думаешь?
5 ответов:
есть еще один способ запустить контейнер с объемом от другого контейнера:
посмотреть 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
Я нашел лучший способ редактировать код в разработке-установить все как обычно (включая клонирование репозитория вашего приложения), но переместить весь код в контейнер, чтобы сказать
/srv/myapp.deploy.dev. Затем запустите контейнер сrwобъем/srv/myapp, и init.D скрипт, который очищает этот Том и копирует новое содержимое внутри следующим образом:rm -r /srv/myapp/* rm -r /srv/myapp/.[!.]* cp -r /srv/myapp.deploy.dev/. /srv/myapp rm -r /srv/myapp.deploy.dev
Примечание: Вы не можете mount каталог контейнера для размещения каталога с
-v.Я не думаю, что вам нужно калечить /srv и /srv.развертывание-копирование. Если вы
Я думаю, что:
вы должны использовать том для постоянных / общих данных:
-v /hostdir/user-uploads:/srv/myapp/user-uploads, или вы можете использовать объем данных в контейнере. Вы можете рассмотреть это база данных, поддерживаемая файловой системой который хранится на хосте (только данные контейнер) и контейнер может использовать его-v.вы правы: для развертывание производства - вы можете построить изображение с исходным кодом (
git clone), вы создаете образ для каждого выпуска. Нет необходимости изменять исходный код в производство.на среда разработки - вы должны построить изображение без исходного кода или вы можете затенить каталог исходного кода с объемом в случае использования одного и того же образа для развертывания/развития. Затем git клонирует исходный код локально и использует volume
-v /hostdir/project/src:/srv/projectподелиться исходным кодом с контейнера. Предпочтительно вы должны поделиться исходным кодом только для чтения (:roв конце) и любые временные или промежуточные файлы должны быть сохранены где-то еще в контейнере. У меня есть сценарии установки (миграция данных, перестроение некоторых файлов данных индекса/кэша и т. д.) выполняется при запуске контейнера, перед запуском службы. Поэтому всякий раз, когда я чувствую, что мне нужна свежестьre-init, Я просто убиваю контейнер dev и запускаю его снова. Или я не останавливаю старый контейнер - я просто запускаю другой.
Я нашел хороший способ сделать это, используя только ГИТ:
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.
предполагая, что git не является точкой входа контейнера, если git установлен в вашем контейнере docker, вы можете ssh в контейнер и запустить
git clone/git pull. Из-за того, как Том совместно используется с хостом, изменения, внесенные из контейнера в файлы, будут внесены и на хост (на самом деле это те же файлы).здесь это некоторое объяснение того, как быстро ssh в контейнер.
Comments