Как редактировать код в контейнере 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, поэтому автоматизация этого не будет проблемой. А ты как думаешь?

764   5  

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

    Ничего не найдено.