docker_container_export
导出 Docker 容器为备份包
一键脚本
bash <(curl -sL gitee.com/meimolihan/cmdbox/raw/master/sh/docker_container_export.sh) 容器名
bash <(curl -sL ../sh/docker_container_export.sh) 容器名
补充说明
docker export 命令用于将容器的文件系统导出为 tar 归档文件,适用于容器备份、迁移或导入为镜像。
脚本结合 docker export 和日期自动命名,一键将指定容器导出为 容器名_YYYY-MM-DD.tar。
语法
docker_container_export.sh <容器名>
参数
<容器名> 要导出的容器名称或 ID
常用实例
# 导出 my-nginx 容器为 my-nginx_2025-01-01.tar
docker_container_export.sh my-nginx
# 导出后查看文件
ls -lh *.tar
输出文件
# 导出文件名格式
容器名_YYYY-MM-DD.tar
注意事项
docker export只导出容器文件系统,不包含容器配置、环境变量、端口映射等元数据- 如需保留完整容器配置,建议使用
docker commit或备份卷数据 - 导出的 tar 包可通过
docker_container_import.sh导入为镜像
脚本源码
#!/bin/bash
set -uo pipefail
list_color_init() {
export gl_hui=$'\033[38;5;59m'
export gl_hong=$'\033[38;5;9m'
export gl_lv=$'\033[38;5;10m'
export gl_huang=$'\033[38;5;11m'
export gl_lan=$'\033[38;5;32m'
export gl_bai=$'\033[38;5;15m'
export gl_zi=$'\033[38;5;13m'
export gl_bufan=$'\033[38;5;14m'
export reset=$'\033[0m'
}
list_color_init
log_info() { echo -e "${gl_lan}[信息]${gl_bai} $*"; }
log_ok() { echo -e "${gl_lv}[成功]${gl_bai} $*"; }
log_warn() { echo -e "${gl_huang}[警告]${gl_bai} $*"; }
log_error() { echo -e "${gl_hong}[错误]${gl_bai} $*" >&2; }
handle_invalid_input() {
echo -ne "\r\033[K${gl_huang}无效的输入,请重新输入! ${gl_zi} 1 ${gl_huang} 秒后返回"
sleep 1
echo -ne "\r\033[K${gl_lv}无效的输入,请重新输入! ${gl_zi}0${gl_lv} 秒后返回"
sleep 0.5
echo -ne "\r\033[K"
}
break_end() {
echo -e "${gl_lv}操作完成${gl_bai}"
echo -e "${gl_bai}按任意键继续 ${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai}\c"
read -r -n 1 -s -p ""
echo ""
}
show_help() {
echo -e "${gl_lv}用法:${gl_bai} $0 ${gl_lan}<容器名>${gl_bai}"
echo ""
echo -e "${gl_lv}导出指定容器为 tar 备份包${gl_bai}"
echo ""
echo -e "${gl_lv}参数:${gl_bai}"
echo -e " ${gl_lan}<容器名>${gl_bai} 要导出的容器名称或ID"
echo ""
echo -e "${gl_lv}示例:${gl_bai}"
echo -e " ${gl_bai}$0 ${gl_lan}my-nginx${gl_bai}"
echo -e " ${gl_bai}$0 ${gl_lan}container_name${gl_bai}"
exit 0
}
check_container_exists() {
local container_name="$1"
if ! docker inspect "$container_name" &>/dev/null; then
return 1
fi
return 0
}
get_running_containers() {
docker ps --format "{{.Names}}" 2>/dev/null
}
export_container() {
local CONTAINER="$1"
local BACKUP="${CONTAINER}_$(date +%F).tar"
if ! check_container_exists "$CONTAINER"; then
log_error "容器不存在: $CONTAINER"
return 1
fi
docker export "$CONTAINER" > "$BACKUP"
clear
echo -e "${gl_zi}>>> Docker 容器导出${gl_bai}"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
CUR_DIR=$(pwd)
log_ok "已导出: ${gl_lv}$CUR_DIR/${BACKUP}${gl_bai}"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
break_end
}
interactive_mode() {
local containers=()
while IFS= read -r line; do
containers+=("$line")
done < <(get_running_containers)
if [[ ${#containers[@]} -eq 0 ]]; then
clear
echo -e "${gl_zi}>>> Docker 容器导出${gl_bai}"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
log_warn "没有运行中的容器"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
break_end
return
fi
while true; do
clear
echo -e "${gl_zi}>>> Docker 容器导出${gl_bai}"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
echo -e "${gl_bai}运行中的容器:${gl_bai}"
for i in "${!containers[@]}"; do
echo -e " ${gl_bufan}$((i+1)).${gl_bai} ${containers[$i]}"
done
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
echo -e " ${gl_hong}0.${gl_bai} 退出"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
read -r -e -p "$(echo -e "${gl_bai}请选择容器编号: ")" choice
if [[ "$choice" == "0" || "$choice" == "00" || "$choice" == "000" ]]; then
clear
exit 0
fi
if ! [[ "$choice" =~ ^[0-9]+$ ]] || [[ "$choice" -lt 1 ]] || [[ "$choice" -gt "${#containers[@]}" ]]; then
handle_invalid_input
continue
fi
local selected="${containers[$((choice-1))]}"
export_container "$selected"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
break_end
break
done
}
main() {
if [[ $# -ge 1 ]]; then
export_container "$1"
else
interactive_mode
fi
}
main "$@"
创建本地脚本
new_script="docker_container_export.sh"
cat > "$new_script" << 'EOF'
#!/bin/bash
# 粘贴脚本源码
EOF
chmod +x "$new_script" && ./"$new_script" && rm -f "$new_script"
相关命令
- docker-hub_images_check
- docker-hub_images_delete
- docker-hub_images_delete_menu
- docker_build_push_img
- docker_check_env
- docker_clean_all
- docker_container_export 👈 当前所在位置
- docker_container_import
- docker_daily_scripts
- docker_disk_list
- docker_images_list
- docker_images_manager
- docker_install_uninstall
- docker_login
- docker_login_check
- docker_network_list
- docker_occupy_list
- docker_port_list
- docker_ps_list
- docker_update_all
- docker_user
- docker_volume_list