Подтвердить что ты не робот

Как редактировать код в контейнере 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. Я уже использую псевдонимы для всех команд докеров, поэтому автоматизировать это не будет проблемой. Как вы думаете?

4b9b3361

Ответ 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 в контейнер.