Docker 容器无法停止或删除 - 权限被拒绝错误

问题描述 投票:0回答:9

问题:无法停止 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,内部版本 6d101fb

重现步骤:

  • 使用 Dockerfile 和 docker-compose.yml 创建了一个 Rails 项目。 docker-compose.yml 是版本 3。
  • 使用
    docker build -t <project name> .
    docker-compose up --build
  • 成功构建图像
  • 容器启动并成功运行。
  • 尝试使用 docker-compose down 来停止 docker compose。

我尝试过的:

  • 我必须运行
    sudo service docker restart
    ,然后才能删除容器。
  • 卸载了 docker,删除了 docker 目录,然后重新安装了所有内容。仍然面临同样的问题。

注意:此配置之前工作正常,但不知何故文件权限可能已更改,我看到此错误。我必须运行

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
ruby-on-rails docker docker-compose docker-swarm
9个回答
254
投票

我从 snap 包安装了 Docker,过了一会儿我决定转向 apt 存储库安装。

我面临着同样的问题,并且使用

sudo aa-remove-unknown
对我有用。

因此不需要重新安装 Apparmor。


119
投票

对于任何不希望完全清除 AppArmor 的人。

检查状态:

sudo aa-status

关闭并防止其重新启动:

sudo systemctl disable apparmor.service --now

卸载 AppArmor 配置文件:

sudo service apparmor teardown

检查状态:

sudo aa-status

您现在应该能够停止/杀死容器。


36
投票

解决该问题的直接方法是在要杀死的容器中执行 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


15
投票

我能够解决这个问题。由于某些未知问题,ubuntu 中的 Apparmor 服务无法正常工作。该问题与 moby 项目https://github.com/moby/moby/issues/20554中报告的问题类似。

/etc/apparmor.d/tunables
文件夹为空,https://github.com/mlaventure建议清除/重新安装apparmor以使其恢复到初始状态。

所以我重新安装了apparmor,并且重新启动后问题就解决了。

希望这有帮助。


12
投票

就我而言,问题是我的 docker 安装有冲突:

docker
本身来自官方
docker-ce
,但
docker-compose
来自 Ubuntu snap 包。

从官方 github 正确安装

docker-compose
此处的说明)就可以了。我还遵循了 Linux 安装后说明,它可能也有帮助(以非 root 用户身份运行 docker)

我只是将 AppArmor 单独留在这里 - 我没有碰它。


3
投票

它只是简单地解决了我的工作

 sudo snap remove docker

1
投票

操作系统:Ubuntu 22.04 LTS docker版本:20.10.17,内部版本100c701 docker-compose 版本:1.29.2

我遇到了同样的问题并尝试遵循,

  1. sudo systemctl 禁用 apparmor.service --now
  2. sudo service apparmor 拆解
  3. sudo aa-删除-未知
  4. 重启

这些解决方案对我不起作用。 发生此问题的原因是 Linux 内核的安全功能 apparmor。

我们可以通过以非 root 用户身份运行 docker daemon(无根模式)来禁用它, 执行以下命令,

解决方案:

  1. curl -fsSL https://get.docker.com/rootless |嘘 | FORCE_ROOTLESS_INSTALL=1
  2. 导出 PATH=/home/用户目录/bin:$PATH

docker-compose down 或 docker rm,可以工作


1
投票

我在这方面遇到了很长时间的麻烦,所以首先我意识到我必须终止容器所在的网络。所以我遵循了所有步骤。但我的许可仍然被拒绝。然后就做了

sudo docker 检查 portainer

然后在“State”->“Pid”中,我将 Pid 与

须藤杀死


0
投票

对于我来说

问题:守护程序的错误响应:无法停止容器:0b21a3532fe2:权限被拒绝 (基础)ubuntu@ip-10-0-0-46:~/无服务器$

解决方案:

sudo 服务 docker stop sudo 服务 docker 启动

然后再次停止

docker stop $(docker ps -aq)

如果想删除的话

docker rm $(docker ps -aq)

© www.soinside.com 2019 - 2024. All rights reserved.