web-dev-qa-db-fra.com

Les conteneurs Docker ne peuvent pas être arrêtés ou supprimés - autorisation refusée Erreur

Issue : Je ne peux pas arrêter les conteneurs Docker. Le message d'erreur suivant s'affiche lorsque j'essaie d'arrêter les conteneurs.

ERROR: for yattyadocker_web_1  cannot stop container: 1f04148910c5bac38983e6beb3f6da4c8be3f46ceeccdc8d7de0da9d2d76edd8: Cannot kill container 1f04148910c5bac38983e6beb3f6da4c8be3f46ceeccdc8d7de0da9d2d76edd8: rpc error: code = PermissionDenied desc = permission denied

Version du système d'exploitation/build: Ubuntu 16.04 | Docker Version 17.09.0-ce, construisez afdb6d4 | Docker Compose version 1.17.1, build 6d101fb

Étapes pour reproduire:

  • Création d'un projet Rails avec Dockerfile et docker-compose.yml. docker-compose.yml est de la version 3.
  • L’image est construite avec succès avec docker build -t <project name> . ou docker-compose up --build
  • Les conteneurs démarrent et fonctionnent correctement.
  • Essayez d’arrêter la composition de docker avec docker-compos down.

Ce que j'ai essayé:

  • Je dois exécuter Sudo service docker restart et ensuite les conteneurs peuvent être supprimés.
  • Menu fixe désinstallé, répertoire de menu fixe supprimé, puis tout réinstallé. Toujours confronté au même problème. 

Remarque : Cette configuration fonctionnait correctement auparavant, mais les autorisations sur les fichiers ont peut-être changé et c'est ce que je constate. Je dois exécuter Sudo service docker restart et ensuite les conteneurs peuvent être supprimés. Mais cela est très gênant et je ne sais pas comment résoudre ce problème.

Fichiers de référence:

# 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

Et 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
12
Parth Modi

J'ai pu résoudre le problème. Le service Apparmor d'ubuntu ne fonctionnait pas normalement en raison d'un problème inconnu. Le problème était similaire à celui signalé dans le projet moby https://github.com/moby/moby/issues/20554

Le dossier /etc/apparmor.d/tunables était vide et https://github.com/mlaventure suggéré à purger/réinstaller apparmor pour le remettre à l'état initial.

J'ai donc réinstallé apparmor et après le redémarrage le problème a été résolu.

J'espère que cela t'aides.

9
Parth Modi

Pour tous ceux qui ne souhaitent pas purger complètement AppArmor.

Vérifier l'état: Sudo aa-status

Arrêtez-le et empêchez-le de redémarrer: Sudo systemctl disable apparmor.service --now

Décharger des profils AppArmor: Sudo service apparmor teardown

Vérifier l'état: Sudo aa-status

Vous devriez maintenant pouvoir arrêter/tuer les conteneurs.

49
jsloan117

Une solution directe au problème consiste à exécuter bash dans le conteneur à tuer et à appeler directement kill à cet endroit. Un exemple:

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

Pour vérifier que le conteneur a été tué, exécutez docker ps. C'est une alternative utile à la solution qui réinstalle apparmor car cela supprimera également snapd .

2
Moritz

Dans mon cas, le problème était que j'avais des installations de menu fixe en conflit: docker lui-même issu du paquetage docker-ce officiel , mais docker-compose à partir du paquet d'instantané Ubuntu.

Installer correctement docker-compose à partir du github officiel ( instructions here ) a fait l'affaire. J'ai également suivi les instructions de post-installation Linux et cela a peut-être aussi aidé (exécuter docker en tant qu'utilisateur non root)

Je viens de quitter AppArmor seul ici - je n'y ai pas touché.

0
user3929660