You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 16:47:37