来自守护进程的错误响应:无法停止容器 - 信号 init 进程导致“权限被拒绝”

Posted

技术标签:

【中文标题】来自守护进程的错误响应:无法停止容器 - 信号 init 进程导致“权限被拒绝”【英文标题】:Error response from daemon: cannot stop container - signaling init process caused "permission denied" 【发布时间】:2019-01-14 17:22:51 【问题描述】:

我启动了 Docker 容器:

VirtualBox:~$ sudo docker run --name rabbitmq -d -p 0.0.0.0:5672:5672 -p 0.0.0.0:15672:15672 bitnami/rabbitmq

一切都很好,容器正在工作。

docker  ps

CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                                                                                                NAMES
dd3d12133774        bitnami/rabbitmq:latest   "/app-entrypoint.sh …"   37 minutes ago      Up 37 minutes       0.0.0.0:4369->4369/tcp, 0.0.0.0:5672->5672/tcp, 0.0.0.0:15672->15672/tcp, 0.0.0.0:25672->25672/tcp   sad_knuth
203500ee7f1e        bitnami/rabbitmq          "/app-entrypoint.sh …"   5 hours ago         Up 5 hours          0.0.0.0:5672->5672/tcp, 4369/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp                                rabbitmq

当我使用命令时:

docker stop 203500ee7f1e

docker stop rabbitmq

什么都没有发生(错误):

VirtualBox:~$ docker stop rabbitmq
Error response from daemon: cannot stop container: rabbitmq: Cannot kill container 203500ee7f1eb09bf0ecb2fdaf2041f4da27990a3654bca90b808a3ec36238cf: unknown error after kill: docker-runc did not terminate sucessfully: container_linux.go:393: signaling init process caused "permission denied"
: unknown

输出 Docker 版本

VirtualBox:~$ docker version
Client:
 Version:           18.06.0-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        0ffa825
 Built:             Wed Jul 18 19:09:54 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.0-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       0ffa825
  Built:            Wed Jul 18 19:07:56 2018
  OS/Arch:          linux/amd64
  Experimental:     false

输出 Docker 信息

    VirtualBox:~$ docker info
Containers: 2
 Running: 2
 Paused: 0
 Stopped: 0
Images: 2
Server Version: 18.06.0-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: d64c661f1d51c48782c9cec8fda7604785f93587
runc version: 69663f0bd4b60df09991c08812a60108003fa340
init version: fec3683
Security Options:
 apparmor
 seccomp
  Profile: default
Kernel Version: 4.15.0-29-generic
Operating System: Ubuntu 18.04.1 LTS
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.852GiB
Name: ivanpuzyrev-VirtualBox
ID: 2LAE:PADC:VVDH:G2OW:MWUD:IRTS:CRNU:J727:DDEV:ZYBS:GTGG:SIOI
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

WARNING: No swap limit support

请帮忙!!!什么都没发生。或许你有什么想法?

【问题讨论】:

您是否以特权用户身份启动docker stop 【参考方案1】:

以超级用户身份尝试:

sudo docker container stop rabbitmq

【讨论】:

【参考方案2】:

尝试杀死它:

sudo docker kill rabbitmq

这将强制停止但不会移除容器。

【讨论】:

【参考方案3】:

由于您以“sudo”身份运行 docker,因此您必须使用“sudo”权限停止它

致stop容器

sudo docker stop 203500ee7f1e

致remove容器

sudo docker rm 203500ee7f1e

如果你想停止并移除所有容器,下面的命令会很有用

sudo docker stop $(docker ps -a -q)  && sudo docker rm  $(docker ps -a -q) 

【讨论】:

【参考方案4】:

我不同意所有建议 sudo 的人。 docker 命令将 api 调用发送到守护进程,如果您需要 sudo 来运行该命令,您将从连接到 docker 套接字的失败中知道。守护进程本身应该以 root 身份运行。

在我看来,权限错误可能是由 AppArmor 策略引起的,也可能只是引擎/容器/runc 中的错误。您还在运行 Ubuntu 18.04,该 docker 最近才添加了支持,因此如果可能,请尝试运行稍旧版本的 Ubuntu LTS,或者查看其中一个边缘/夜间构建是否解决了该问题。在短期内,您可能有幸重新启动 docker 引擎 (systemctl restart docker) 并可能重新启动整个主机,看看这是否能解决问题。

【讨论】:

这是一个有用的建议,它可以特定于 Ubuntu 18.04。要关闭容器,我必须运行 docker exec -it <container> bash 然后 kill 1 - 我在这里找到它:github.com/docker/for-linux/issues/254 对于alpine 图像,您可以运行docker exec -it <container> kill 1【参考方案5】:

尝试重新加载守护进程并重新启动 docker,然后删除所有容器。

在 Linux 上:

$sudo systemctl daemon-reload
$sudo systemctl restart docker
$docker ps –qa|xargs docker rm

在 Win.10 上:

$docker stop $(docker ps -a -q)
$docker ps -qa|xargs docker rm

【讨论】:

【参考方案6】:

你需要告诉rabbitmq退出,使用rabbitmqctl这样:

docker exec rmq rabbitmqctl stop

(将 rmq 换成您的容器名称)

一旦进程安全停止,docker 容器应该关闭。

【讨论】:

【参考方案7】:

在 Debian GNU/Linux 10 (buster) 上使用 snap 安装 docker 后,我遇到了同样的问题。根据https://docs.docker.com/engine/install/debian/#install-using-the-repository删除snap docker版本并安装docker后 和 https://docs.docker.com/engine/install/linux-postinstall/ 到 Configure Docker to start on boot$ sudo systemctl enable docker 并重新启动,$ docker stop name-of-container 工作。

【讨论】:

【参考方案8】:

我遇到了同样的问题,我通过使用此命令在 docker 容器中执行 shell 解决了它 docker exec -it imagebase bash 然后发出kill 1 命令。

【讨论】:

这个对我有用【参考方案9】:

This answer 也帮助我使用 docker:

之后

sudo aa-remove-unknown

问题立即消失,docker stop 将再次按预期工作。这是由于 Apparmor 服务的一些问题。

【讨论】:

【参考方案10】:

这可能是由 Ubuntu 的安全性引起的,尤其是 apparmor

在这种情况下,您应该添加到 docker run --security-opt apparmor:unconfined。这似乎比移除 Apparmor 更可取。

例如试试:

docker run --security-opt apparmor:unconfined -ti ubuntu bash

然后尝试docker stop 看看它是否有效!

如果这不起作用,或者如果您想停止一个已经在运行的容器,请考虑使用 -9 从容器内部杀死根进程。

我在 mssql 容器中遇到过类似的问题。 mssql 服务器放弃了它的特权,所以docker stop 失败了。但是,要解决这个问题,必须明确提升容器内的权限,例如使用-u 0特权:

docker exec -u 0 -it mssql ps aux

在我的情况下检查输出:

USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
mssql          1  0.4  0.0  61108 18380 ?        Ssl  16:55   0:00 /opt/mssql/bin/sqlservr
mssql          9  8.4  1.5 16865624 1014056 ?    Sl   16:55   0:04 /opt/mssql/bin/sqlservr
root         267  0.0  0.0   5896  2848 pts/0    R+   16:56   0:00 ps aux

所以,我需要杀死(with -9)容器内的进程 1 和 9...

docker exec -u 0 -it mssql kill -9 1 9

请注意,在运行 mssql 时,我将容器命名为 mssql... 在你的情况下,它本来是rabbitmq

【讨论】:

【参考方案11】:

尝试执行这两个命令:

$ sudo systemctl restart docker.socket docker.service
$ docker rm container_id

【讨论】:

以上是关于来自守护进程的错误响应:无法停止容器 - 信号 init 进程导致“权限被拒绝”的主要内容,如果未能解决你的问题,请参考以下文章

来自守护进程的 Docker 错误响应:无法启动容器

如何修复“docker:来自守护进程的错误响应:无法链接到非运行容器:/db AS /odoo/db

来自守护进程的 Docker 错误响应:“冲突……容器已在使用”

来自守护进程的错误响应:构建容器的拉取访问被拒绝,存储库不存在或可能需要“docker login”

docker:来自守护进程的错误响应:无法选择设备驱动程序“”具有功能:[[gpu]]

来自守护进程的错误响应:驱动程序未能在端点modem_aryabhata 上编程外部连接