问题:无法停止docker容器,每当我尝试停止容器时,我都会收到以下错误消息,
ERROR: for yattyadocker_web_1 cannot stop container: 1f04148910c5bac38983e6beb3f6da4c8be3f46ceeccdc8d7de0da9d2d76edd8: Cannot kill container 1f04148910c5bac38983e6beb3f6da4c8be3f46ceeccdc8d7de0da9d2d76edd8: rpc error: code = PermissionDenied desc = permission denied
操作系统版本/版本: Ubuntu 16.04 | Docker版本17.09.0-ce,构建afdb6d4 | Docker Compose版本1.17.1,build 6d101fb
重现的步骤:
docker build -t <project name> .
或docker-compose up --build
我尝试了什么::
sudo service docker restart
,然后才能删除容器。 注意:此配置之前工作正常,但文件权限可能已更改,我看到此错误。我必须运行sudo service docker restart
,然后才能删除容器。但这非常不方便,我不知道如何解决这个问题。
参考文件:
# docker-compose.yml
version: '3'
volumes:
db-data:
driver: local
redis-data:
driver: local
services:
db:
image: postgres:9.4.1
volumes:
- db-data:/var/lib/postgresql/data
ports:
- "5432:5432"
env_file: local_envs.env
web:
image: yattya_docker:latest
command: bundle exec puma -C config/puma.rb
tty: true
stdin_open: true
ports:
- "3000:3000"
links:
- db
- redis
- memcached
depends_on:
- db
- redis
- memcached
env_file: local_envs.env
redis:
image: redis:3.2.4-alpine
ports:
# We'll bind our host's port 6379 to redis's port 6379, so we can use
# Redis Desktop Manager (or other tools) with it:
- 6379:6379
volumes:
# We'll mount the 'redis-data' volume into the location redis stores it's data:
- redis-data:/var/lib/redis
command: redis-server --appendonly yes
memcached:
image: memcached:1.5-alpine
ports:
- "11211:11211"
clock:
image: yattya_docker:latest
command: bundle exec clockwork lib/clock.rb
links:
- db
depends_on:
- db
env_file: local_envs.env
worker:
image: yattya_docker:latest
command: bundle exec rake jobs:work
links:
- db
depends_on:
- db
env_file: local_envs.env
和Dockerfile:
# Dockerfile
FROM ruby:2.4.1
RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*
ENV APP_HOME /app
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
ADD Gemfile* $APP_HOME/
RUN bundle install
ADD . $APP_HOME
RUN mkdir -p ${APP_HOME}/log
RUN cat /dev/null > "$APP_HOME/log/development.log"
RUN mkdir -p ${APP_HOME}/tmp/cache \
&& mkdir -p ${APP_HOME}/tmp/pids \
&& mkdir -p ${APP_HOME}/tmp/sockets
EXPOSE 3000
答案 0 :(得分:71)
对于不想完全清除AppArmor的任何人。
检查状态:Theme.AppCompat.Light.DarkActionBar
关机并阻止其重新启动:sudo aa-status
卸载AppArmor配置文件:sudo systemctl disable apparmor.service --now
检查状态:sudo service apparmor teardown
您现在应该能够停止/杀死容器。
答案 1 :(得分:12)
我能够解决这个问题。由于一些未知问题,ubuntu中的Apparmor服务无法正常工作。问题类似于moby项目official MS Github documentation中报告的问题。
/etc/apparmor.d/tunables
文件夹为空,https://github.com/moby/moby/issues/20554建议清除/重新安装apparmor以使其进入初始状态。
所以我重新安装了apparmor,重新启动后 问题解决了。
希望这有帮助。
答案 2 :(得分:4)
我从snap软件包安装了Docker,一段时间后,我决定转向apt仓库安装。
我遇到了同样的问题,使用sudo aa-remove-unknown
对我有用。
因此无需重新安装Apparmor。
答案 3 :(得分:3)
该问题的直接解决方案是在要杀死的容器中执行bash并在那里直接调用kill
。一个例子:
host$ docker exec -it <container-name> sh
container$ ps
PID USER TIME COMMAND
1 root 0:00 {entrypoint.sh} /bin/sh /entrypoint.sh
16 root 0:00 {entrypoint.sh} /bin/sh /entrypoint.sh
24 root 0:00 sh
31 root 0:00 ps
container$ kill 1
要检查容器是否被杀死,请运行docker ps
。这是解决方案重新安装apparmor的有用替代方法,因为这也会删除 snapd 。
答案 4 :(得分:2)
就我而言,问题是我的docker安装冲突:docker
本身来自官方docker-ce
package,但docker-compose
来自Ubuntu snap软件包。
从官方github(instructions here)正确安装docker-compose
可以达到目的。我还遵循了Linux post-install instructions,它可能也有帮助(以非root用户身份运行docker)
我只是将AppArmor留在这里-我没有碰它。