Mam kontener Docker, który utworzyłem, po prostu instalując Docker na Ubuntu i wykonując:
sudo docker run -i -t ubuntu /bin/bash
Natychmiast zacząłem instalować Javę i niektóre inne narzędzia, spędziłem z nią trochę czasu i zatrzymałem kontener
exit
Potem chciałem dodać tom i zdałem sobie sprawę, że nie jest to tak proste, jak się spodziewałem. Jeśli sudo docker -v /somedir run ...
użyję, skończę z nowym, nowym kontenerem, więc zainstalowałbym Javę i zrobiłbym to, co już zrobiłem, by dotrzeć do kontenera z zamontowanym woluminem.
Cała dokumentacja dotycząca montowania folderu z hosta wydaje się sugerować, że montowanie woluminu jest czymś, co można zrobić podczas tworzenia kontenera. Tak więc jedyną opcją, której muszę unikać od nowa konfigurowania nowego kontenera od zera, jest zatwierdzenie istniejącego kontenera w repozytorium i wykorzystanie go jako podstawy nowego podczas montowania woluminu.
Czy to rzeczywiście jedyny sposób na dodanie woluminu do istniejącego kontenera?
docker
tagu to 34k + , czyli znacznie więcej niż te dwie strony stackoverflow.com/questions/tagged/dockerOdpowiedzi:
Możesz zatwierdzić swój istniejący kontener (czyli utworzyć nowy obraz ze zmian kontenera), a następnie uruchomić go z nowymi wierzchowcami.
Przykład:
Jeśli wszystko jest w porządku, zatrzymaj stary pojemnik i użyj tego nowego.
Otóż to :)
źródło
newnameofcontainer
że prawdopodobnie należy to nazwaćnew_image_name
- ponieważdocker commit
tworzy nowy obraz w twoim systemie. Następnie w poniższym przykładziedocker run
użyjesz nazwy obrazu , z którego chcesz uruchomić nowy kontener. Powyższe działa, ale chciałem wyjaśnić innym, że symbol zastępczy newname ofcontainer powyżej jest w rzeczywistości nazwą nowego obrazu. dzięki! niesamowita odpowiedź. och, możesz zobaczyć nowo utworzony obraz z pierwszej komendydocker image ls
docker run -v /srv/a:/tmp ubuntu:14.04
jest dobrze.Nie mamy żadnego sposobu na dodanie woluminu w uruchomionym kontenerze, ale aby osiągnąć ten cel, możesz użyć poniższych poleceń:
Skopiuj pliki / foldery między kontenerem a lokalnym systemem plików: -
W celach informacyjnych patrz:
https://docs.docker.com/engine/reference/commandline/cp/
źródło
Pomyślnie zamontowałem
/home/<user-name>
folder mojego hosta w/mnt
folderze istniejącego (nie uruchomionego) kontenera. Możesz to zrobić w następujący sposób:Otwórz plik konfiguracyjny odpowiadający zatrzymanemu kontenerowi, który można znaleźć w
/var/lib/docker/containers/99d...1fb/config.v2.json
(może dotyczyćconfig.json
starszych wersji dokera).Znajdź
MountPoints
sekcję, która była pusta w moim przypadku:"MountPoints":{}
. Następnie zamień zawartość na coś takiego (możesz skopiować odpowiednią zawartość z innego pojemnika z odpowiednimi ustawieniami):lub taki sam (sformatowany):
service docker restart
Działa to dla mnie z Ubuntu 18.04.1 i Docker 18.09.0
źródło
systemctl stop docker.service
2. Edytujconfig.v2.json
:vim <(jq . /var/lib/docker/containers/<container-ID>/config.v2.json)
3. Zapisz aktualizacje do pliku::w config.v2.json
4. Wyjdź z vima::q!
5. Zaktualizuj istniejący plik:jq -c . config.v2.json > /var/lib/docker/containers/<container-ID>/config.v2.json
6. Uruchom silnik dokera:systemctl start docker.service
7. Uruchom kontener, jeśli to konieczne :docker start <container-name/ID>
8. Ciesz się :-)service docker restart
. Próbowałemdocker restart <container>
wtedy, aby nowa konfiguracja nie została odczytana i została zastąpiona przez starą konfigurację.jq
Pomoże również ładnie wydrukować JSON, więc można edytować go jako człowieka:cat config.v2.json | jq . > config.json
Jérôme Petazzoni ma całkiem interesujący post na blogu, w jaki sposób dołączyć wolumin do kontenera podczas jego działania . To nie jest coś, co jest wbudowane w Docker po wyjęciu z pudełka, ale możliwe do osiągnięcia.
Jak również wskazuje
YMMV
źródło
Niestety opcja przełączania do montowania woluminu znajduje się tylko w
run
poleceniu.docker run --help
-v, --volume list Bind mount a volume (default [])
Istnieje jednak sposób obejścia tego problemu, dzięki czemu nie trzeba ponownie instalować aplikacji, które zostały już skonfigurowane w kontenerze.
docker container export -o ./myimage.docker mycontainer
docker import ./myimage.docker myimage
docker run -i -t -v /somedir --name mycontainer myimage /bin/bash
źródło
docker container
nie jest prawidłowym poleceniem w wersji 1.11.2 (która jest najnowszą wersją obsługiwaną przez Synology od tego momentu). Nie mogę jednak znaleźć żadnych dokumentów mówiących, kiedy został dodany. W tym przypadku pierwszym poleceniem jestdocker export -o ./myimage.docker mycontainer
.Uwaga dotycząca używania kontenerów Docker Windows po tym, jak musiałem długo szukać tego problemu!
Warunki:
Problem:
Rozwiązanie częściowo opisane tutaj:
docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y microsoft/mssql-server-windows-developer
docker exec -it <CONTAINERID> cmd.exe
mkdir DirForMount
docker container stop <CONTAINERID>
docker commit <CONTAINERID> <NEWIMAGENAME>
docker container rm <CONTAINERID>
docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y -v C:\DirToMount:C:\DirForMount <NEWIMAGENAME>
Po tym rozwiązałem ten problem w kontenerach Windows dokerów.
źródło
Najlepszym sposobem jest skopiowanie wszystkich plików i folderów w katalogu w lokalnym systemie plików poprzez:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
SRC_PATH
jest na kontenerzeDEST_PATH
jest na localhostNastępnie
docker-compose down
podłącz wolumin do tego samegoDEST_PATH
i uruchom kontenery Docker za pomocądocker-compose up -d
Dodaj wolumin, postępując zgodnie z
docker-compose.yml
źródło