Контейнеры 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, build afdb6d4 | Docker Compose версия 1.17.1, build 6d101fb

Действия по воспроизведению:

  • Создал проект рельсов с Dockerfile и docker-compose.yml. docker-compose.yml имеет версию 3.
  • Изображение успешно построено с помощью 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 port 6379 to redis 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 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

Ответы

Ответ 1

Я смог решить проблему. Аппартерское обслуживание в ubuntu не работало нормально из-за неизвестной проблемы. Проблема была аналогична проблеме, описанной в мобильном проекте https://github.com/moby/moby/issues/20554.

Папка /etc/apparmor.d/tunables была пуста, и https://github.com/mlaventure предложила очистить/переустановить apparmor, чтобы получить ее в исходное состояние.

Поэтому я переустановил apparmor, и после перезапуска проблема была решена.

Надеюсь это поможет.

Ответ 2

Для тех, кто не хочет полностью очищать AppArmor.

Проверить статус: sudo aa-status

Выключение и предотвращение перезапуска: sudo systemctl disable apparmor.service --now

Выгружать профили AppArmor: sudo service apparmor teardown

Проверить статус: sudo aa-status

Теперь вы должны иметь возможность останавливать/убивать контейнеры.

Ответ 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

В моем случае проблема заключалась в том, что у меня были конфликтующие установки docker: сам docker из официального пакета docker-ce, но docker-compose из пакета Ubuntu snap.

Правильная установка docker-compose с официального github (инструкции здесь) сделала свое дело. Я также следовал инструкциям Linux после установки, и это также могло помочь (для запуска docker от имени пользователя без полномочий root)

Я просто оставил AppArmor здесь один - я не трогал его.

Ответ 5

Я установил Docker из пакета snap и через некоторое время решил перейти к установке apt репозитория.

Я столкнулся с той же проблемой, и использование sudo aa-remove-unknown сработало для меня.

Таким образом, переустановка Apparmor не требовалась.