我可以使用——restart=always启用自动重启,但在我停止容器后,如何关闭该属性?

我通常运行一个web服务器,通常映射端口80:

docker run -d --restart=always -p 80:80 -i -t myuser/myproj /bin/bash

但有时我想运行映像的新版本,但又想保留旧的容器。问题是,如果有多个容器使用——restart=always,那么只有一个容器(随机?)启动,因为它们都在争夺主机上的80端口。


当前回答

如果你有一个蜂群重新启动容器,蜂群将重新启动你停止或rm的任何容器,不管重启选项如何。这是一个特性,不是bug。

确保你没有在运行一个你忘记的服务:

docker service ls

然后停止服务

docker service rm <service id discovered with previous command>

其他回答

如果你有一个蜂群重新启动容器,蜂群将重新启动你停止或rm的任何容器,不管重启选项如何。这是一个特性,不是bug。

确保你没有在运行一个你忘记的服务:

docker service ls

然后停止服务

docker service rm <service id discovered with previous command>

docker update——restart=yes/no <container-name/containerId>

修改所有docker容器的重启策略。

识别将在引导时启动的docker容器

这个shell脚本将识别所有重启策略不是“no”的docker容器。

作为根用户

CONTAINERS=$(for f in  /var/lib/docker/containers/*/hostconfig.json ; 
do 
container=`echo $f | rev | cut -d '/' -f 2| rev`
jq \
 --arg container "$container" \
 --arg file "$f" '{"RestartPolicy":.RestartPolicy.Name, 'file':$file, 'container':$container} | select(.RestartPolicy != "no")' "$f" | \
  jq .container -r | tr '\n' ' '
done)

或NON-root…

CONTAINERS=$(for f in  $(sudo sh -c "ls /var/lib/docker/containers/*/hostconfig.json"); 
do 
container=`echo $f | rev | cut -d '/' -f 2| rev`
sudo jq \
  --arg container "$container" \
  --arg file "$f" '{"RestartPolicy":.RestartPolicy.Name, 'file':$file, 'container':$container} | select(.RestartPolicy != "no")' "$f" | \
  jq .container -r | tr '\n' ' '
done)

(可选)查看所选容器的列表

echo $CONTAINERS

立即将所有容器设置为“no”。

docker update --restart=no $CONTAINERS

你可以使用——restart=unless-stopped选项,就像@Shibashis提到的,或者更新重启策略(这需要docker 1.11或更新版本);

请参阅docker更新和docker重启策略的文档。

docker update --restart=no my-container

更新现有容器的重启策略(my-container)

你可以使用——restart=unless-stopped来启动容器。