Postgres Docker容器停止后自动重启并生成新ID,如何禁用?
嘿,我一眼就看出问题所在了——你是用Docker Compose管理这个Postgres服务的对吧?所以单独执行docker update --restart=no <容器ID>根本起不了作用,因为Compose会一直监控它定义的服务状态,一旦发现容器停了,就会按照规则重新创建新容器,这就是为啥你每次停完都会看到新的容器ID。
下面是彻底解决这个问题的步骤:
1. 先清理当前的Compose服务容器
首先用Compose命令停止并移除现有的相关容器,避免旧配置干扰:
docker-compose down
这个命令会停止所有由当前docker-compose.yml定义的服务容器,还会清理默认创建的网络,确保我们从头开始配置。
2. 修改docker-compose.yml配置
找到db服务的配置块,添加restart: no参数,明确禁用自动重启策略。修改后的完整配置如下:
version: '3.1' services: web: build: ./xxx ports: - "9001:80" volumes: - ./app/xxx:/var/www/html environment: XDEBUG_CONFIG: > remote_host=172.18.0.1 idekey=xxx PHP_IDE_CONFIG: serverName=xxx links: - db db: image: postgres environment: POSTGRES_DB: xxx POSTGRES_USER: xxx POSTGRES_PASSWORD: xxx ports: - "5432:5432" restart: no # 新增这一行,禁用自动重启
小贴士:如果之后你想让容器只在意外崩溃时重启(手动停止后不重启),可以把
restart: no改成restart: on-failure,这样更贴合实际使用场景。
3. 重新用Compose启动服务
执行下面的命令重新部署服务:
docker-compose up -d
这次启动的Postgres容器就会严格遵循你设置的restart: no策略了。
验证效果
现在你再执行docker stop <新的容器ID>,然后用docker ps查看,就不会看到新的Postgres容器自动冒出来了~
补充说明:为什么之前的docker update没用?
简单来说,Compose是基于服务定义来管理容器的,它会定期校验容器状态是否和配置一致。你单独修改单个容器的重启策略,但compose文件里没改,Compose会认为这个容器不符合定义,于是销毁它并重建一个符合配置的新容器,所以才会出现新ID的情况。
内容的提问来源于stack exchange,提问作者Marcin Grudziński

