来自守护进程的错误响应:无法停止容器 - 信号 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:来自守护进程的错误响应:无法链接到非运行容器:/db AS /odoo/db
来自守护进程的 Docker 错误响应:“冲突……容器已在使用”
来自守护进程的错误响应:构建容器的拉取访问被拒绝,存储库不存在或可能需要“docker login”