docker commit tworzy nowy obraz Dockera z aktualnego stanu działającego (lub zatrzymanego) kontenera. Innymi słowy: bierze wszystko, co nagrzebałeś w środku kontenera — doinstalowane pakiety, zmienione pliki konfiguracyjne, dodane dane — i zamraża to w postaci obrazu, z którego możesz potem odpalać kolejne kontenery. To szybki sposób na „zachowanie” eksperymentu, ale traktuj go jako ostateczność, a nie codzienne narzędzie pracy (o tym niżej).
Składnia i najważniejsze opcje
Podstawowa składnia wygląda tak: docker commit [OPCJE] KONTENER [REPOZYTORIUM[:TAG]]
-m,--message— wiadomość commita (opis zmian), widoczna potem wdocker history.-a,--author— autor obrazu, np."Jan Kowalski [email protected]".-c,--change— dokleja instrukcję jak z Dockerfile do nowego obrazu. Obsługiwane:CMD,ENTRYPOINT,ENV,EXPOSE,LABEL,ONBUILD,USER,VOLUME,WORKDIR. Flagę możesz podać kilka razy.-p,--pause— domyślnietrue: kontener jest pauzowany na czas commita, żeby uniknąć uszkodzenia danych.--pause=falsewyłącza pauzę.
Przykłady użycia
docker commit moj_kontener moj_obraz:v1— zapisuje stan kontenera moj_kontener jako obraz moj_obraz z tagiem v1.docker commit -m "dodano nginx" -a "Jan Kowalski" web web:gotowy— commit z opisem i autorem, gotowy do przeglądania w historii obrazu.docker commit -c 'CMD ["nginx","-g","daemon off;"]' web web:start— ustawia domyślną komendę startową nowego obrazu bez przebudowy.docker commit -c 'ENV APP_ENV=prod' -c 'EXPOSE 8080' app app:prod— dokłada zmienną środowiskową i deklarację portu za jednym zamachem.docker commit --pause=false baza baza:snapshot— robi obraz bez pauzowania kontenera (przydatne, gdy nie możesz przerwać ruchu, ale ryzykujesz niespójność danych).
Częste błędy i pułapki
Największa pułapka jest filozoficzna: commit to nie backup i nie sposób na budowanie obrazów. Obraz zrobiony ręcznie jest nieodtwarzalny — nikt (łącznie z Tobą za miesiąc) nie wie, co dokładnie się w nim znalazło. Do powtarzalnych obrazów używaj Dockerfile i docker build. Po drugie: commit zapisuje warstwę systemu plików kontenera, ale nie zapisuje danych z wolumenów (VOLUME) — to, co siedzi w zamontowanym wolumenie, do obrazu nie trafi. Po trzecie: pamiętaj, że commit z domyślną pauzą na chwilę zamraża procesy w kontenerze, więc na produkcji potrafi spowodować mikroprzestój. I drobiazg na koniec: --change CMD oczekuje formatu JSON-array (exec form), inaczej komenda może zostać opakowana w powłokę inaczej, niż się spodziewasz.
Powiązane komendy: docker build, docker history, docker save, docker export, docker tag, docker container diff.