Jak edytować kod w kontenerze Docker w fazie deweloperskiej?

Mam kod wszystkich moich stron pod /srv w moich kontenerach.

Mój plik Dockerfile pobiera kod za pomocą Gita i czyni go częścią obrazu, aby ułatwić wdrożenie do produkcji.

Ale jak edytować kod w rozwoju? Myślałem, że rozwiązaniem jest użycie woluminów, np.: -v /docker/mycontainer/srv:/srv. Ale nadpisuje katalog w kontenerze. Jeśli to pierwszy raz, kiedy go uruchamiam, opróżnia go, ponieważ nie ma nic w gospodarzu. Więc cokolwiek zrobiłem w Dockerfile było dostaje zagubieni.

Istnieją również katalogi i pliki wewnątrz /srv/myapp, które chcę udostępniać w różnych wersjach mojej aplikacji, np: /srv/myapp/user-uploads. Jest to powszechna praktyka w profesjonalnym tworzeniu stron internetowych.

Więc co mogę zrobić, aby móc robić te wszystkie rzeczy?:
  • edycja kodu w / srv w rozwoju
  • share / srv / myapp/user-uploads w różnych wersjach
  • pozwól Dockerfile pobrać kod. Wykonywanie "git clone "lub" git pull " poza Dockerem moim zdaniem, to by zniweczyło cel Dockera. Poza tym są rzeczy, których nie mogę uruchomić na hoście, takie jak migracje baz danych lub Inne skrypty specyficzne dla aplikacji.

Czy istnieje sposób na odwrotne mocowanie głośności? Mam na myśli, aby kontener nadpisał hosta, zamiast odwrotnie.

Myślę, że jednym soluitonem może być skopiowanie / srv do / srv.deployment-kopiowanie przed uruchomieniem demona kontenera. A kiedy uruchamiam demona sprawdź czy / srv.deployment-Kopia istnieje i kopiuje wszystko z powrotem do / srv. W ten sposób mogę używać / srv jako woluminu i nadal być w stanie wdrożyć do niego kod za pomocą pliku Dockerfile. Używam już aliasów do wszystkich poleceń Dockera, więc automatyzacja nie będzie problemem. Co o tym myślisz?
Author: ChocoDeveloper, 2014-04-03

5 answers

Istnieje inny sposób, aby uruchomić pojemnik z objętością z innego pojemnika:

Spójrz na https://docs.docker.com/userguide/dockervolumes/
Tworzenie i montaż pojemnika objętości danych

Jeśli masz pewne trwałe DANE, które chcesz udostępnić między kontenerami lub użyć z nietrwałych kontenerów, najlepiej utworzyć nazwany kontener objętości danych, a następnie zamontować dane z niego.

Stwórzmy nowy kontener o nazwie z wolumin do podzielenia się.

$ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres

Można następnie użyć flagi --volumes-from, aby zamontować wolumin / dbdata w innym kontenerze.

$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres

I inne:

$ sudo docker run -d --volumes-from dbdata --name db2 training/postgres

Inną użyteczną funkcją, którą możemy wykonać z woluminami, jest użycie ich do tworzenia kopii zapasowych, przywracania lub migracji. W tym celu używamy flagi --volumes-from, aby utworzyć nowy kontener, który montuje ten wolumin, w następujący sposób:

$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

=============

Myślę, że nie powinieneś używać montowania katalogu hosta do Pojemnik. Ale możesz używać woluminów ze wszystkimi jego mocami. Możesz edytować pliki w woluminach za pomocą innych kontenerów z doskonałym zestawem edytorów i narzędzi. I pojemnik to Twoja aplikacja będzie czysta bez napowietrznych.

Struktura to:
- ) Kontener na dane aplikacji
docker run -d -v /data --name data
- ) Kontener dla binariów aplikacji
docker run -d --volumes-from data --name app1
- ) Kontener dla edytorów i narzędzi do rozwoju
docker run -d --volumes-from data --name editor

 12
Author: Mikl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-13 18:31:55

Uznałem, że najlepszym sposobem na edycję kodu w deweloperskim jest zainstalowanie wszystkiego jak zwykle( w tym klonowanie repozytorium aplikacji), ale przenieś cały kod w kontenerze, aby powiedzieć /srv/myapp.deploy.dev. Następnie uruchom kontener z rw woluminem dla /srv/myapp i init.skrypt D, który czyści ten wolumin i kopiuje nową zawartość w ten sposób:

rm -r /srv/myapp/*
rm -r /srv/myapp/.[!.]*
cp -r /srv/myapp.deploy.dev/. /srv/myapp
rm -r /srv/myapp.deploy.dev
 10
Author: ChocoDeveloper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-30 12:32:04

UWAGA: nie można zamontować katalogu kontenera do katalogu hosta za pomocą -v.

Nie wydaje mi się, żeby trzeba było kombinować / srv i / srv.odbiór. If you

Myślę, że:

  • Należy użyć woluminu dla danych trwałych/ współdzielonych: -v /hostdir/user-uploads:/srv/myapp/user-uploads, lub można użyć kontenera woluminów danych concept. Możesz uznać tę bazę danych wspieraną przez system plików , która jest przechowywana na Hostie (tylko kontener danych) i kontener może jej używać przez -v.

  • Masz rację: dla wdrożenia produkcji - możesz zbudować obraz z kodem źródłowym (git clone), budujesz obraz dla każdego wydania. Nie powinno być potrzeby edycji kodu źródłowego podczas produkcji.

  • Dla środowiska programistycznego - powinieneś zbudować obraz bez kodu źródłowego lub możesz zasłonić katalog kodu źródłowego woluminem w przypadku użycia tego samego obrazu do wdrożenia/rozwoju. Następnie kod źródłowy git clone lokalnie i używaj volume -v /hostdir/project/src:/srv/project do współdzielenia kodu źródłowego z kontenerem. Najlepiej jest udostępnić kod źródłowy tylko do odczytu (:ro na końcu), a wszelkie pliki tymczasowe lub pośrednie powinny być przechowywane gdzieś indziej w kontenerze. Mam skrypty instalacyjne (migracja danych, przebudowa niektórych plików danych index/cache itp.) wykonywane przy starcie kontenera, przed startem usługi. Więc kiedy czuję, że potrzebuję świeżego re-init, po prostu zabijam kontener dev i uruchamiam go ponownie. Lub nie zatrzymuję starego kontenera-I po prostu uruchom kolejny.

 5
Author: Jiri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-04 08:28:06

Znalazłem fajny sposób na zrobienie tego używając just 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

Zakłada, że masz lokalny git z kodem. Git musi być zainstalowany w kontenerze. Alternatywnie możesz użyć docker run i kontenera danych z współdzielonym woluminem z zainstalowanym Gitem.

 5
Author: till,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-21 20:17:43

Zakładając, że git nie jest entrypoint kontenera, jeśli git jest zainstalowany w kontenerze docker, możesz ssh do kontenera i uruchomić git clone/git pull. Ze względu na sposób współdzielenia woluminu z hostem, zmiany dokonane z kontenera na pliki będą również wprowadzane na host (w rzeczywistości są to te same pliki).

Tutaj jest wyjaśnienie jak szybko ssh do kontenera.

 1
Author: Christopher Louden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-03 16:36:38