tl:dr
Docker Desktopで仮想ディスク容量を減らすときに、一度全てデータが削除されてしまうので、ImageとVolumeを引き継ぐために用意したスクリプト
環境
Mac
Docker Desktop v4.31.1
実行方法
1.スクリプトを作成
2.スクリプトファイルに実行権限を付与
chmod +x backup.sh restore.sh
3.backup.shを実行
./backup.sh
4.Docker Desktopの仮想ディスク容量を小さくする
5.restore.shを実行
./restore.sh
backup.sh
#!/bin/bash
# バックアップディレクトリの作成
BACKUP_DIR="./docker_backup"
VOLUME_BACKUP_DIR="$BACKUP_DIR/volumes"
IMAGE_BACKUP_DIR="$BACKUP_DIR/images"
mkdir -p $VOLUME_BACKUP_DIR
mkdir -p $IMAGE_BACKUP_DIR
# コンテナの停止
docker stop $(docker ps -q)
# ボリュームのバックアップ
echo "バックアップ中のボリューム..."
docker volume ls -q | while read volume; do
echo "ボリューム $volume をバックアップ中..."
docker run --rm -v $volume:/volume -v $VOLUME_BACKUP_DIR:/backup busybox tar cf /backup/$volume.tar -C /volume ./
done
# イメージのバックアップ
echo "バックアップ中のイメージ..."
docker images --format "{{.Repository}}_{{.Tag}} {{.ID}}" | while read image; do
image_name=$(echo $image | awk '{print $1}')
image_id=$(echo $image | awk '{print $2}')
echo "イメージ $image_name ($image_id) をバックアップ中..."
docker save -o $IMAGE_BACKUP_DIR/${image_name}.tar $image_id
done
echo "バックアップが完了しました。"
restore.sh
#!/bin/bash
# バックアップディレクトリの指定
BACKUP_DIR="./docker_backup"
VOLUME_BACKUP_DIR="$BACKUP_DIR/volumes"
IMAGE_BACKUP_DIR="$BACKUP_DIR/images"
# ボリュームのリストア
echo "リストア中のボリューム..."
ls $VOLUME_BACKUP_DIR/*.tar | while read backup; do
volume=$(basename $backup .tar)
echo "ボリューム $volume をリストア中..."
docker volume create $volume
docker run --rm -v $volume:/volume -v $VOLUME_BACKUP_DIR:/backup busybox tar xf /backup/$(basename $backup) -C /volume
done
# イメージのリストア
echo "リストア中のイメージ..."
ls $IMAGE_BACKUP_DIR/*.tar | while read backup; do
image_file=$(basename $backup .tar)
image_name=$(echo $image_file | awk -F '_' '{print $1}')
image_tag=$(echo $image_file | awk -F '_' '{print $2}')
echo "イメージ $image_name:$image_tag をリストア中..."
docker load -i $IMAGE_BACKUP_DIR/$image_file.tar
image_id=$(docker images -q | head -n 1) # リストア直後の最新のイメージIDを取得
docker tag $image_id $image_name:$image_tag
done
echo "リストアが完了しました。"
あとがき
適当なところも多いので、スクリプトは好きなようにアレンジしてください!