如何修复Docker容器升级脚本?实现同配置新建同名容器
修复Docker自定义容器升级脚本
原脚本的核心问题是直接传递JSON格式的Config给docker create无法被识别,且未提取端口、卷挂载等关键主机配置。以下是修复后的脚本,可完整复用原容器的所有配置并完成升级:
#!/bin/bash # 检查是否传入容器名称 if [ -z "$1" ]; then echo "请传入要升级的容器名称" exit 1 fi CONTAINER_NAME="$1" IMAGE_NAME=$(docker inspect --format='{{.Config.Image}}' "$CONTAINER_NAME") # 更新镜像:如果是本地构建的镜像,替换为docker build命令 echo "更新镜像..." docker pull "$IMAGE_NAME" # 本地构建时取消注释并修改路径 # docker build -t "$IMAGE_NAME" /path/to/your/dockerfile-directory # 停止原容器 echo "停止容器 $CONTAINER_NAME..." docker stop "$CONTAINER_NAME" # 删除旧备份容器(若存在) if docker ps -aqf "name=${CONTAINER_NAME}_old" >/dev/null; then echo "删除旧备份容器 ${CONTAINER_NAME}_old..." docker rm "${CONTAINER_NAME}_old" fi # 重命名原容器为备份 echo "重命名容器 $CONTAINER_NAME 为 ${CONTAINER_NAME}_old..." docker rename "$CONTAINER_NAME" "${CONTAINER_NAME}_old" # 提取原容器的关键配置参数 PORTS=$(docker inspect --format='{{range $p, $conf := .HostConfig.PortBindings}}-p {{$p}}:{{(index $conf 0).HostPort}} {{end}}' "$CONTAINER_NAME_old") VOLUMES=$(docker inspect --format='{{range $v := .HostConfig.Binds}}-v {{$v}} {{end}}' "$CONTAINER_NAME_old") ENV_VARS=$(docker inspect --format='{{range $env := .Config.Env}}-e "{{env}}" {{end}}' "$CONTAINER_NAME_old") RESTART_POLICY=$(docker inspect --format='{{.HostConfig.RestartPolicy.Name}}' "$CONTAINER_NAME_old") RESTART_POLICY=${RESTART_POLICY:-no} NETWORK=$(docker inspect --format='{{.HostConfig.NetworkMode}}' "$CONTAINER_NAME_old") # 创建并启动新容器 echo "创建新容器 $CONTAINER_NAME..." docker run -d \ --name "$CONTAINER_NAME" \ --restart "$RESTART_POLICY" \ --network "$NETWORK" \ $PORTS \ $VOLUMES \ $ENV_VARS \ "$IMAGE_NAME" # 验证启动状态并处理失败回滚 if docker ps -f "name=$CONTAINER_NAME" >/dev/null; then echo "容器 $CONTAINER_NAME 升级成功!" # 可选:不需要备份时删除旧容器 # docker rm "${CONTAINER_NAME}_old" else echo "容器启动失败,开始恢复原容器..." docker stop "$CONTAINER_NAME" 2>/dev/null docker rm "$CONTAINER_NAME" 2>/dev/null docker rename "${CONTAINER_NAME}_old" "$CONTAINER_NAME" docker start "$CONTAINER_NAME" echo "已恢复原容器 $CONTAINER_NAME" exit 1 fi
关键修复说明
- 参数合法性检查:确保用户传入容器名称,避免无意义执行
- 镜像更新:优先拉取/构建最新镜像,这是升级的核心步骤
- 完整配置提取:从备份容器中提取端口映射、卷挂载、环境变量、重启策略、网络配置等所有GUI设置的参数
- 失败回滚:如果新容器启动失败,自动恢复原容器,避免服务中断
- 参数格式转换:将
docker inspect的输出转换为docker run可识别的命令行参数
内容的提问来源于stack exchange,提问作者Darren Oakey
相关产品推荐
相关产品推荐

