Zde se děje několik věcí:
Nejprve docker commit
je kódová vůně. Obvykle jej používají ti, kteří vytvářejí obrázky ručním procesem, spíše než automatizují jejich sestavení pomocí souboru Dockerfile, který by umožnil snadnou rekreaci. Pokud je to jen trochu možné, doporučuji vám pro vytvoření obrázku přejít na soubor Dockerfile.
Dále docker commit
nezaznamená změny provedené ve svazku. Ke stejnému problému dochází, pokud se pokusíte aktualizovat svazek pomocí RUN
krok v Dockerfile. Oba tyto zachycují změny v souborovém systému kontejneru a ukládají tyto změny jako vrstvu v obrazu dockeru a svazky nejsou součástí souborového systému kontejneru. To je také viditelné, pokud spustíte docker diff
proti kontejneru. V tomto případě upstream image definoval svazek ve svém Dockerfile:
VOLUME /var/lib/mysql
A docker nemá příkaz k vrácení vytvořeného svazku z Dockerfile. Budete muset buď přímo upravit definici obrázku z vnějšku dockeru (nedoporučuje se), nebo vytvořit svůj vlastní upstream image s odstraněným tímto krokem (doporučeno).
Obrázek mysql poskytuje možnost vložit vlastní skripty pro vytváření databáze do /docker-entrypoint-initdb.d
, který můžete přidat s vlastním obrazem, který rozšiřuje mysql, nebo připojit jako svazek. Zde byste vložili své schéma nebo inicializovali ze známé zálohy pro vývoj.
A konečně, pokud je cílem mít stálost, měli byste svá data ukládat do svazku, nikoli zasílat kontejnery:
docker run -v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
Svazek vám umožňuje znovu vytvořit kontejner, upgradovat na novější verzi mysql, když jsou vydány opravy (např. opravy zabezpečení), aniž byste přišli o svá data.
Pro zálohování svazku se toto exportuje do tgz:
docker run --rm -v mysql-data:/source busybox tar -cC /source . >backup.tgz
Chcete-li obnovit svazek, vytvoří se svazek z tgz:
docker run --rm -i -v mysql-data:/target busybox tar -xC /target <backup.tgz