問題:ドッカーコンテナを停止できません。コンテナを停止しようとすると、次のエラーメッセージが表示されます。
ERROR: for yattyadocker_web_1 cannot stop container: 1f04148910c5bac38983e6beb3f6da4c8be3f46ceeccdc8d7de0da9d2d76edd8: Cannot kill container 1f04148910c5bac38983e6beb3f6da4c8be3f46ceeccdc8d7de0da9d2d76edd8: rpc error: code = PermissionDenied desc = permission denied
OSバージョン/ビルド: Ubuntu 16.04 | Dockerバージョン17.09.0-ce、ビルドafdb6d4 | Docker Composeバージョン1.17.1、ビルド6d101fb
再現手順:
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'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プロジェクトで報告された問題に似ていました https://github.com/moby/moby/issues/20554 。
/etc/apparmor.d/tunables
フォルダーは空で、 https://github.com/mlaventure は、apparmorをパージ/再インストールして初期状態に戻すことを提案しました。
だから私はapparmorを再インストールし、再起動後に問題が解決しました。
お役に立てれば。
AppArmorを完全に消去したくない人向け。
ステータスを確認:Sudo aa-status
シャットダウンして、再起動を防ぎます:Sudo systemctl disable apparmor.service --now
AppArmorプロファイルのアンロード:Sudo service apparmor teardown
ステータスを確認:Sudo aa-status
これで、コンテナを停止/強制終了できます。
スナップパッケージからDockerをインストールし、しばらくして、aptリポジトリのインストールに移行することにしました。
私は同じ問題に直面していたので、Sudo aa-remove-unknown
を使用するとうまくいきました。
そのため、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
コンテナが削除されたことを確認するには、docker ps
を実行します。これはsnapdも削除するため、apparmorを再インストールするソリューションの便利な代替手段です。
私の場合、問題は、競合するドッカーのインストールがあることでした:docker
自体は公式の docker-ce
package ですが、Ubuntuスナップパッケージからはdocker-compose
です。
公式githubからdocker-compose
を正しくインストールすると( 手順はこちら )うまくいきました。また、 Linuxのインストール後の指示 に従いましたが、それも助けたかもしれません(非rootユーザーとしてdockerを実行するため)
ここでAppArmorをそのまま残しました-触れませんでした。