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.
- 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?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 aplikacjidocker run -d -v /data --name data
- ) Kontener dla binariów aplikacjidocker run -d --volumes-from data --name app1
- ) Kontener dla edytorów i narzędzi do rozwojudocker run -d --volumes-from data --name editor
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
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żegore-init
, po prostu zabijam kontener dev i uruchamiam go ponownie. Lub nie zatrzymuję starego kontenera-I po prostu uruchom kolejny.
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.
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.
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