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:
docker build -t <project name> .
ou docker-compose up --build
Ce que j'ai essayé: :
Sudo service docker restart
et ensuite les conteneurs peuvent être supprimés. 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
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.
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.
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 .
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é.