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

pw9qyyiw  于 2023-04-29  发布在  Docker
关注(0)|答案(7)|浏览(424)

Issue:无法停止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 Version 17.09.0-ce,构建afdb 6d 4|Docker Compose版本1。17.1,构建6d 101 fb
复制步骤:

  • 使用Dockerfile和docker-compose创建了一个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
2eafrhcq

2eafrhcq1#

我从snap包安装了Docker,过了一段时间,我决定转移到apt仓库安装。
我也遇到了同样的问题,使用sudo aa-remove-unknown对我很有效。
所以不需要重新安装Apparmor。

cczfrluj

cczfrluj2#

对于任何不希望完全清除AppArmor的人。
检查状态:sudo aa-status
关闭并阻止其重新启动:sudo systemctl disable apparmor.service --now
卸载AppArmor配置文件:sudo service apparmor teardown
检查状态:sudo aa-status
你现在应该可以停止/杀死容器了。

czfnxgou

czfnxgou3#

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

wribegjk

wribegjk4#

我能够解决这个问题。ubuntu中的Apparmor服务由于一些未知的问题而无法正常工作。该问题与moby项目https://github.com/moby/moby/issues/20554中报告的问题相似。
/etc/apparmor.d/tunables文件夹为空,https://github.com/mlaventure建议清除/重新安装apparor以使其恢复初始状态。
所以我重新安装了apparmor,重启后问题解决了。
希望这能帮上忙。

j91ykkif

j91ykkif5#

在我的例子中,问题是我有冲突的docker安装:docker本身来自官方的docker-ce包,但docker-compose来自Ubuntu snap包。
从官方github(instructions here)正确安装docker-compose就做到了。我还遵循了Linux post-install instructions,它可能也有帮助(以非root用户身份运行docker)
我只是把AppArmor单独留在这里-我没有碰它。

llew8vvj

llew8vvj6#

操作系统:Ubuntu 22.04 LTS docker版本:20.10.17,build 100c 701 docker-compose版本:1.29.2
我也遇到了同样的问题,我试着跟了上去,

  1. sudo systemctl disable apparmor.服务-现在
  2. sudo service apparmor拆卸
  3. sudo aa-删除-未知
    1.重新启动
    这些解决方案对我不起作用。这个问题的发生是因为linux内核的一个安全特性,apparmor。
    我们可以通过以非root用户身份运行docker守护进程(无根模式)来禁用它,执行以下命令,
    解决方案:
  4. curl -fsSL https://get.docker.com/rootless|sh|FORCE_ROOTLESS_INSTALL=1
  5. export PATH=/home/user-directory/bin:$PATH
    docker-composition down或dockerrm,将工作
c3frrgcw

c3frrgcw7#

我在这方面遇到了很长时间的麻烦,所以首先我意识到我必须终止网络,容器是一个。所以我遵循了所有的步骤。但我还是被拒绝了。然后就这么做了
sudo docker inspect portainer
在“状态”-〉“Pid”中,我然后使用Pid与
sudo kill

相关问题