2017-10-31 68 views
5

Próbuję utworzyć nowy obraz Docker, który nie używa już woluminów z działającego kontenera, który używa obrazów. Woluminy zostały utworzone przy użyciu pliku dokowanego, a nie Dockerfile. Problem polega na tym, że po uruchomieniu nowego kontenera za pomocą nowego pliku docker-compose.yml nadal mapowane są woluminy. Nadal muszę zachować te woluminy i oryginalne pojemniki/obrazy, które z nich korzystają. Ponadto, jeśli to możliwe, chciałbym nadal używać tego samego obrazu dokowanego, wystarczy dodać nową wersję lub: najnowszą. Oto kroki użyłem:Docker compose reusing volume

Nowa wersja istniejącego obrazu:

docker commit <image id> existingImage:new-version 

Utwórz nowy obraz z bieżącym kontenerze trwania:

docker commit <Image ID> newimage 

Utwórz nowe Döcker-compose.yml bez objętości zdefiniowane i uruchamiane dokowanie-tworzenie z inną nazwą projektu

docker-compose -p <new project name> 

Bieganie bez Döcker-komponować, wystarczy użyć Döcker Run:

docker run -d -p 8093:80 <img>:<version> 

każdym razem uruchomić dowolną kombinację tych tomów nadal są odwzorowane z oryginalnego obrazu. Moje pytanie brzmi: jak utworzyć kontener z obrazu, który niegdyś mapował wolumeny, ale nie chcę już używać woluminów?

Edit: Dodatkowe rzeczy próbowałem:

  • Zatrzymaj kontenerów, wyjąć pojemnik, restart dokowane uruchomić doker komponować ponownie. Brak szczęścia.

Edit 2: Zdecydowaliśmy się zacząć od nowa na obrazie. Korzystając z obrazu podstawowego, uruchomiono kontener ze zaktualizowanym plikiem dokowanym, który zawiera teraz niepowiązany obraz. Uruchom doker-compose -f up -d -> STILL ma te same woluminy zmapowane, mimo że obraz nie ma (i nigdy nie ma) woluminów zmapowanych, a bieżący plik docker-compose.yml nie mapuje plików. Wygląda na to, że cache-komponent zapisuje w pamięci podręcznej, które woluminy są mapowane dla projektów.

Po wyszukaniu opcji buforowania w Docker-komponować, natknąłem się na ten artykuł: How to get docker-compose to always re-create containers from fresh images? co wydaje się rozwiązać problem obrazów buforowania, ale nie pojemniki buforowanie tomy

+0

Nie powinieneś używać 'commitowania dockera' do budowania obrazów. Użyj 'Dockerfile' i' docker build'. – BMitch

+0

Dlaczego nie? To naprawdę nie odpowiada na moje pytanie i może być częścią pełnej innej rozmowy. –

+0

Ponieważ nie można go utrzymywać ani łatwo odtwarzać. Jeśli Twój obraz zostanie kiedykolwiek usunięty lub popełniłeś błąd, nie możesz wrócić. Jest to kodowy zapach próbujący utrzymać pojemniki w taki sposób, w jaki instalowałbyś serwer. To nie jest odpowiedź na twoje pytanie, dlatego jest to komentarz tutaj. – BMitch

Odpowiedz

2

Według innego wpisu SO, co próbuję zrobić, nie jest możliwe. Na przyszłość nie można dołączyć woluminów do obrazu, a później zdecydować się je usunąć. Nowy obraz musi zostać utworzony bez woluminów. Odniesienia: How to remove configure volumes in docker images

+0

Źle zinterpretowałem twoje pytanie, nie zdawałem sobie sprawy, że masz zdefiniowane woluminy wewnątrz twojego obrazu. Osobiście polecam odstąpienie od tej praktyki ze względu na wszystkie problemy, które on stwarza, w tym ten, który widzisz: po zdefiniowaniu woluminu na obrazie, nie może on być niezdefiniowany. https://boxboat.com/2017/01/23/volumes-and-dockerfiles-dont-mix/ – BMitch

1

Aby usunąć tomów wraz z pojemników używanych przez docker-compose , użyj docker-compose down -v.

Aby rozpocząć tworzenie pojemników z docker-compose, pozostaw istniejące woluminy w stanie nienaruszonym, ale nie używaj tych woluminów, należy zmienić nazwę projektu. Możesz użyć do tego docker-compose -p new_project_name up -d.


Edycja: tutaj jest przykład pokazujący jak doker-komponować nie ponowne nazwanych tomy między różnymi projektami, ale to nie ponowne użycie i utrzymywać głośność chyba zrobić down -v:

$ docker-compose -p proj1 -f docker-compose.vol-named.yml up -d 
Creating network "proj1_default" with the default driver 
Creating volume "proj1_data" with default driver 
Creating proj1_test_1 ... 
Creating proj1_test_1 ... done 

$ docker ps 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS     NAMES 
71f2eb516f71  busybox    "tail -f /dev/null"  5 seconds ago  Up 2 seconds         proj1_test_1 

$ docker exec -it 71f /bin/sh 
/# ls /data 
/# echo "Hello proj1" >/data/data.txt 
/# exit 

Tom jest teraz zaludnionych, pozwala zatrzymać i rozpocząć nowy pojemnik, aby pokazać, że utrzymują się:

$ docker-compose -p proj1 -f docker-compose.vol-named.yml down 
Stopping proj1_test_1 ... done 
Removing proj1_test_1 ... done 
Removing network proj1_default 

$ docker-compose -p proj1 -f docker-compose.vol-named.yml up -d 
Creating network "proj1_default" with the default driver 
Creating proj1_test_1 ... 
Creating proj1_test_1 ... done 

$ docker ps 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS     NAMES 
311900fd3d27  busybox    "tail -f /dev/null"  5 seconds ago  Up 3 seconds         proj1_test_1 

$ docker exec -it 311 /bin/sh 
/# cat /data/data.txt 
Hello proj1 
/# exit 

tam oczekiwany trwały objętość, pozwala uruchomić inny projekt w w tym samym czasie, aby pokazać, że objętość będzie niezależna:

$ docker-compose -p proj2 -f docker-compose.vol-named.yml up -d 
Creating network "proj2_default" with the default driver 
Creating volume "proj2_data" with default driver 
Creating proj2_test_1 ... 
Creating proj2_test_1 ... done 

$ docker ps 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS     NAMES 
d39e6fc51436  busybox    "tail -f /dev/null"  4 seconds ago  Up 2 seconds         proj2_test_1 
311900fd3d27  busybox    "tail -f /dev/null"  33 seconds ago  Up 32 seconds        proj1_test_1 

$ docker exec -it d39 /bin/sh 
/# ls -al /data 
total 8 
drwxr-xr-x 2 root  root   4096 Nov 6 19:56 . 
drwxr-xr-x 1 root  root   4096 Nov 6 19:56 .. 
/# exit 

Wolumin jest całkowicie pusty w nowym projekcie. Oczyśćmy.

$ docker-compose -p proj2 -f docker-compose.vol-named.yml down -v 
Stopping proj2_test_1 ... 
Stopping proj2_test_1 ... done 
Removing proj2_test_1 ... done 
Removing network proj2_default 
Removing volume proj2_data 

$ docker volume ls 
DRIVER    VOLUME NAME 
local    proj1_data 

Uwaga wolumin występuje w wersji proj1.

$ docker-compose -p proj1 -f docker-compose.vol-named.yml down -v 
Stopping proj1_test_1 ... done 
Removing proj1_test_1 ... done 
Removing network proj1_default 
Removing volume proj1_data 

$ docker volume ls 
DRIVER    VOLUME NAME 

Ale wykonanie down -v powoduje usunięcie woluminu.

+0

Zmiana nazwy projektu nie działa. Jeśli zatwierdzę obraz i uruchomię go całkowicie oddzielnie, I.E. nowy plik do tworzenia dokowanego, inny folder, a nawet po prostu korzystanie z funkcji dokowania, woluminy wciąż istnieją. –

+0

Nie doświadczam tego samego. Być może możesz udostępnić [mcve] (http://stackoverflow.com/help/mcve). – BMitch

+0

Rozumiem, że funkcja dokowania nie utrzymuje woluminów opublikowanych przez Ciebie, ale to nie jest mój problem. Problem, który mam, to obrazy Docker'a zachowują zmapowane informacje o woluminie podczas używania zatwierdzania dockera. –