来自守护程序的错误响应:无法停止容器 - 导致初始化进程发信号 "permission denied"
Error response from daemon: cannot stop container - signaling init process caused "permission denied"
我启动了 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
求助!!!什么都没发生。也许你有什么想法?
以超级用户身份尝试:
sudo docker container stop rabbitmq
尝试杀死它:
sudo docker kill rabbitmq
这将强制停止但不会移除容器。
因为你 运行 和 docker 一样 'sudo',你必须用 '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)
我不同意每个建议使用 sudo 的人。 docker 命令向守护程序发送 api 调用,如果您需要对 运行 命令执行 sudo,您将从无法连接到 docker 套接字中获知。守护进程本身应该 运行ning 作为 root。
在我看来,权限错误可能是由 AppArmor 策略引起的,也可能只是 engine/containerd/runc 中的错误。您还 运行ning Ubuntu 18.04 docker 最近才添加支持,因此如果可能,请尝试 运行ning 稍旧版本的 Ubuntu LTS,或者查看 edge/nightly 构建之一是否解决了该问题。在短期内,您可能会幸运地重新启动 docker 引擎 (systemctl restart docker
) 并可能重新启动整个主机,看看是否可以解决问题。
尝试重新加载守护进程并重新启动 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
你需要告诉 rabbitmq 退出,通过使用 rabbitmqctl 这样:
docker exec rmq rabbitmqctl stop
(将 rmq 换成您的容器名称)
进程安全停止后,docker 容器应该关闭。
在 Debian GNU/Linux 10 (buster) 上使用 snap 安装 docker 后,我遇到了同样的问题。删除 snap docker 版本并根据 https://docs.docker.com/engine/install/debian/#install-using-the-repository 安装 docker 后
和
https://docs.docker.com/engine/install/linux-postinstall/ 最多 配置 Docker 以启动 和 $ sudo systemctl enable docker
并重新启动,$ docker stop name-of-container
工作。
我遇到了同样的问题,我通过使用此命令在 docker 容器中执行 shell 解决了它
docker exec -it imagebase bash
然后发出 kill 1
命令。
也帮助我 docker:
之后
sudo aa-remove-unknown
问题立即消失,docker stop
将按预期再次运行。参见:aa-remove-unknown - remove unknown AppArmor profiles
背景
据我了解,问题的原因是 docker 软件包没有在 AppArmor 服务中安装 docker 的配置文件,因此 docker 被归类为 'unknown' 由 AppArmor 提供。上述命令删除了所有未知应用程序的配置文件,因此它们不再受 AppArmor 限制。
当然,正确的方法是保留未知应用程序的配置文件并为 docker 创建一个 AppArmor 配置文件。根据 docker docs on AppArmor security profiles for Docker,“存在 Docker 引擎守护程序的配置文件,但当前未安装”。
不过,我自己也懒得去深究,所以这里无法提供说明。
这可能是由 Ubuntu 的安全性引起的,尤其是 apparmor
在那种情况下,您应该在 docker 运行 中添加 --security-opt apparmor:unconfined
。这似乎比移除 apparmor 更可取。
例如尝试:
docker run --security-opt apparmor:unconfined -ti ubuntu bash
然后尝试 docker stop
看看效果如何!
如果这不起作用,或者如果您想停止已经 运行ning 的容器,请考虑使用 -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
请注意,当 运行ning mssql
我给容器命名为 mssql...
在你的情况下应该是 rabbitmq
尝试执行这两个命令:
$ sudo systemctl restart docker.socket docker.service
$ docker rm {container_id}
我启动了 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
求助!!!什么都没发生。也许你有什么想法?
以超级用户身份尝试:
sudo docker container stop rabbitmq
尝试杀死它:
sudo docker kill rabbitmq
这将强制停止但不会移除容器。
因为你 运行 和 docker 一样 'sudo',你必须用 '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)
我不同意每个建议使用 sudo 的人。 docker 命令向守护程序发送 api 调用,如果您需要对 运行 命令执行 sudo,您将从无法连接到 docker 套接字中获知。守护进程本身应该 运行ning 作为 root。
在我看来,权限错误可能是由 AppArmor 策略引起的,也可能只是 engine/containerd/runc 中的错误。您还 运行ning Ubuntu 18.04 docker 最近才添加支持,因此如果可能,请尝试 运行ning 稍旧版本的 Ubuntu LTS,或者查看 edge/nightly 构建之一是否解决了该问题。在短期内,您可能会幸运地重新启动 docker 引擎 (systemctl restart docker
) 并可能重新启动整个主机,看看是否可以解决问题。
尝试重新加载守护进程并重新启动 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
你需要告诉 rabbitmq 退出,通过使用 rabbitmqctl 这样:
docker exec rmq rabbitmqctl stop
(将 rmq 换成您的容器名称)
进程安全停止后,docker 容器应该关闭。
在 Debian GNU/Linux 10 (buster) 上使用 snap 安装 docker 后,我遇到了同样的问题。删除 snap docker 版本并根据 https://docs.docker.com/engine/install/debian/#install-using-the-repository 安装 docker 后
和
https://docs.docker.com/engine/install/linux-postinstall/ 最多 配置 Docker 以启动 和 $ sudo systemctl enable docker
并重新启动,$ docker stop name-of-container
工作。
我遇到了同样的问题,我通过使用此命令在 docker 容器中执行 shell 解决了它
docker exec -it imagebase bash
然后发出 kill 1
命令。
之后
sudo aa-remove-unknown
问题立即消失,docker stop
将按预期再次运行。参见:aa-remove-unknown - remove unknown AppArmor profiles
背景
据我了解,问题的原因是 docker 软件包没有在 AppArmor 服务中安装 docker 的配置文件,因此 docker 被归类为 'unknown' 由 AppArmor 提供。上述命令删除了所有未知应用程序的配置文件,因此它们不再受 AppArmor 限制。
当然,正确的方法是保留未知应用程序的配置文件并为 docker 创建一个 AppArmor 配置文件。根据 docker docs on AppArmor security profiles for Docker,“存在 Docker 引擎守护程序的配置文件,但当前未安装”。
不过,我自己也懒得去深究,所以这里无法提供说明。
这可能是由 Ubuntu 的安全性引起的,尤其是 apparmor
在那种情况下,您应该在 docker 运行 中添加 --security-opt apparmor:unconfined
。这似乎比移除 apparmor 更可取。
例如尝试:
docker run --security-opt apparmor:unconfined -ti ubuntu bash
然后尝试 docker stop
看看效果如何!
如果这不起作用,或者如果您想停止已经 运行ning 的容器,请考虑使用 -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
请注意,当 运行ning mssql
我给容器命名为 mssql...
在你的情况下应该是 rabbitmq
尝试执行这两个命令:
$ sudo systemctl restart docker.socket docker.service
$ docker rm {container_id}