在不停止整个容器的情况下停止 docker 容器内的服务 运行

Stop service running inside a docker container without stopping the whole container

我有一个 docker 容器 运行 Couchbase,我需要对其执行一个操作,需要 couchbase-server 服务暂时停止。 这是覆盖容器内的一些配置文件所必需的。操作步骤如下。

docker exec -it "bumblebase" bash -c "systemctl stop couchbase-server"

docker exec -it "bumblebase" bash -c "echo \"{rest_port, 3456}.\" >> \"/opt/couchbase/etc/couchbase/static_config\""

docker exec -it "bumblebase" bash -c "rm -rf /opt/couchbase/var/lib/couchbase/config/config.dat"

docker exec -it "bumblebase" bash -c "systemctl start couchbase-server"

运行 这给了我以下错误;

Failed to connect to bus: No such file or directory

我只从 following Whosebug answer 中找到了一种解决方法。但是,我不喜欢修改 couchbase 默认图像,而且备用图像现在被标记为暂时未维护。

我还尝试了来自 couchbase documentation 的替代命令:

docker exec -it "bumblebase" bash -c "service couchbase-server stop"

但是我又遇到了另一个错误:

couchbase-server: unrecognized service

我只想让 couchbase-server 服务在容器内停止,这可能吗?还是覆盖我的配置文件的替代解决方案?

您通常不会单独停止容器中的进程,而是停止整个容器本身。事实上,在这种情况下,删除并重新创建容器是很常见的。相应地,您不应该使用 docker exec 来编辑容器内的文件;在例行重启时会丢失。

如果你还没有,你可以从容器中复制配置文件

docker cp bumblebase:/opt/couchbase/etc/couchbase/static_config .

现在您可以使用您选择的编辑器编辑配置文件的本地副本。

最后,您可以停止、删除和重新创建容器。 docker run -v 选项可以将单独的配置文件注入容器。

docker stop bumblebase
docker rm bumblebase
docker run \
  -d \
  -p 8091-8094:8091-8094 -p 11210:11210 \
  --name bumblebase \
  -v $PWD/static_config:/opt/couchbase/etc/couchbase/static_config \
  couchbase:community-6.6.0

出于多种原因,servicesystemctl 等命令在 Docker 中根本不起作用。通常,容器运行的服务器进程是作为主容器进程运行的前台进程;没有初始化系统或任何后台进程,如果服务器进程退出,容器将随之退出。