随机
Enter 搜索 ↑↓ 切换 Esc 清空

docker_restart_policy

命令

修改 Docker 容器重启策略

docker_restart_policy

修改 Docker 容器重启策略

补充说明

docker_restart_policy 整理原生 Docker 命令与 Docker Compose 两种场景的重启策略修改方案,支持单个容器修改、指定多容器修改、批量所有 Compose 项目修改,命令自带容错,空容器不报错,适配多项目目录结构。

重启策略对比

策略 说明 容器手动停止 容器崩溃退出 Docker 重启 系统重启
no(默认) 永不自动重启 ❌ 不重启 ❌ 不重启 ❌ 不重启 ❌ 不重启
on-failure 仅异常退出才重启 ❌ 不重启 ✅ 自动重启 ❌ 不重启 ❌ 不重启
unless-stopped 除非手动停止,否则永远重启 ❌ 不重启 ✅ 自动重启 ✅ 自动重启 ✅ 自动重启
always 无条件永远重启 ✅ 会重启 ✅ 自动重启 ✅ 自动重启 ✅ 自动重启

一、原生 Docker 命令

适用于直接 docker run 部署的容器,可精准指定单个或多个容器修改重启策略。

1.1 修改单个指定容器

支持填写容器 ID 或容器名称。

docker update --restart always 容器ID/容器名

1.2 修改多个指定容器

多个容器名或 ID 用空格分隔批量修改。

docker update --restart always 容器名1 容器名2 容器ID1

二、Docker Compose 项目

适配多文件夹 Compose 部署架构(每个子目录独立一套 docker-compose.yml),精准作用于对应项目容器,不影响全局其他容器。

2.1 修改单个 Compose 项目所有容器

进入目标项目目录,仅修改当前项目内全部容器重启策略。

cd /vol1/1000/compose/项目文件夹名
docker compose ps -q | xargs -r docker update --restart always

2.2 批量修改全部 Compose 项目所有容器

进入总 Compose 根目录,一键遍历所有子项目,批量设置自动重启。

cd /vol1/1000/compose

for d in */; do
  cd "$d"
  docker compose ps -q | xargs -r docker update --restart always
  cd ..
done

三、核心参数说明

  1. --restart always:最高优先级重启策略,容器手动停止除外,无论崩溃、重启系统、Docker 重启,都会自动拉起容器
  2. docker compose ps -q:仅输出当前项目容器 ID,纯净参数输出
  3. xargs -r:容错核心,无匹配容器时直接跳过命令,杜绝"缺少参数"报错

四、重要补充说明

4.1 临时生效

docker update 仅修改当前已存在容器的运行策略,容器删除后重新 docker compose up -d 后策略失效。

4.2 永久生效方案(推荐)

在对应项目 docker-compose.yml 的 services 下添加配置:

services:
  服务名:
    image: 镜像名
    restart: always

修改后执行 docker compose up -d 即可永久生效。

4.3 一键脚本:sed 批量修改

对已有 restart 配置的项目,直接替换为 always

# 已有 restart 则替换为 always
sed -i 's/restart:.*/restart: always/' docker-compose.yml

对尚未配置 restart 的项目,在首个服务名下插入:

# 无 restart 则在首个服务下方插入
sed -i '/^  [0-9a-zA-Z_]*:/a \    restart: always' docker-compose.yml

组合使用:先替换已有配置,再补全缺失配置。

# 一键完成:先替换已有,再补全缺失
sed -i 's/restart:.*/restart: always/' docker-compose.yml
sed -i '/^  [0-9a-zA-Z_]*:/a \    restart: always' docker-compose.yml

五、拓展:全局所有容器批量设置

不区分 Compose 项目,全局所有 Docker 容器一键设置自动重启。

docker ps -aq | xargs -r docker update --restart always