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

Ruby on rails 无法停止或删除Docker容器-权限被拒绝错误,ruby-on-rails,docker,docker-compose,docker-swarm,Ruby On Rails,Docker,Docker Compose,Docker Swarm,问题:无法停止docker容器,每当我尝试停止容器时,都会收到以下错误消息 ERROR: for yattyadocker_web_1 cannot stop container: 1f04148910c5bac38983e6beb3f6da4c8be3f46ceeccdc8d7de0da9d2d76edd8: Cannot kill container 1f04148910c5bac38983e6beb3f6da4c8be3f46ceeccdc8d7de0da9d2d76edd8: rpc

问题:无法停止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

复制步骤:

# 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和docker-compose.yml创建了rails项目。docker-compose.yml是版本3
  • 使用
    docker build-t.
    docker compose-up--build成功构建映像
  • 容器启动并成功运行
  • 尝试在docker compose关闭时停止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

我能够解决这个问题。由于未知问题,ubuntu中的Apparmor服务无法正常工作。该问题与moby项目中报告的问题类似

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

因此,我重新安装了apparmor,重新启动后,问题得到了解决


希望这能有所帮助。

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

检查状态:
sudo aa状态

关闭并阻止其重新启动:
sudo systemctl disable apparmor.service--现在

卸载装置配置文件:
sudo服务装置拆卸

检查状态:
sudo aa状态


你现在应该可以停止/杀死容器了。

在我的例子中,问题是我的docker安装有冲突:
docker
本身来自官方,而
docker compose
来自Ubuntu快照包

从官方github()正确安装docker compose实现了这一目的。我还遵循了,这可能也有帮助(以非root用户的身份运行docker)


我只是把AppArmor一个人留在这里-我没有碰它。

这个问题的一个直接解决方法是在要终止的容器中执行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
host$docker exec-it sh
集装箱$ps
PID用户时间命令
1根0:00{entrypoint.sh}/bin/sh/entrypoint.sh
16根0:00{entrypoint.sh}/bin/sh/entrypoint.sh
24:00上海时间
31根0:00 ps
集装箱$kill 1

要检查容器是否已终止,请运行
docker ps
。这是解决方案重新安装apparmor的一个有用的替代方案,因为这也将从snap软件包中删除snapd

我安装了Docker,过了一段时间,我决定转到apt存储库安装


我也面临同样的问题,使用
sudo aa remove unknown
对我来说很有效


因此不需要重新安装Apparmor。

哪个用户启动容器?我在ubuntu上启动容器。。安装docker时创建的docker用户必须用于管理容器。我是docker的新手。您是否已将您的用户帐户添加到docker组
sudousermod-aG docker${USER}
这将允许您在没有sudo@ShawnC是正确的(至少我怀疑)。要验证,您可以运行“sudo docker compose”或“sudo docker compose down”。@charlieviellard如果您正确设置了
sudo usermod-aG docker${USER}
,并且仍然面临问题,那么您可能需要检查apparmor是否工作正常。我与apparmor有问题,因此我重新安装了docker和apparmor。重启笔记本电脑后,问题就解决了。我认为这个问题和docker hub论坛的更多细节有关:注意!一些应用程序在此之后将无法启动请注意,任何包含
apparmor
的解决方案都会破坏snap和通过snap安装的所有软件包,即使在这之后,我仍然无法在kubernetes上运行和杀死POD。我遵循了上述步骤。现在我的一些应用程序不再启动了。我怎样才能解决这个问题?@HerthaBSC我也有同样的问题。IntelliJ停止了工作。我设法把它修好了。使用
sudo-apt-purge-snap和&sudo-apt-install-snap
解决了这个问题。但我想它会清除那些没有启动的应用程序。IntelliJ,就我而言。所以,我不得不重新安装它。但是一旦你重新启动系统,你必须重复这个过程。您是否找到了永久解决方案?如果我没记错,我按照上述解决方案中的说明禁用了AppArmor,然后重新安装Docker,然后使用
sudo systemctl enabled AppArmor
sudo systemctl start AppArmor
重新启用AppArmor。这不起作用,它只是列出了我案例中的
sh
ps
流程(来自docker compose文件),工作起来很有魅力,谢谢你,这是正确的非核心答案。将Docker安装为
snap
会添加一组AppArmor配置文件,这些配置文件与
apt
安装冲突。这是偶然发生在我身上的,因为我正在寻找一种方便的方法来安装Docker。最后选择了一个
apt
安装,因为它给了我更多的控制,而且更为最新。完美的答案!!它对我来说非常有效。使用
sudo aa remove unknown
导致我的mysql工作台无法工作