docker commit

Tworzy nowy obraz z bieżącego stanu kontenera.

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 w docker 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ślnie true: kontener jest pauzowany na czas commita, żeby uniknąć uszkodzenia danych. --pause=false wyłą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:gotowycommit 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.