web-dev-qa-db-ja.com

Dockerコンテナを停止または削除できません-許可拒否エラー

問題:ドッカーコンテナを停止できません。コンテナを停止しようとすると、次のエラーメッセージが表示されます。

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

再現手順:

  • Dockerfileとdocker-compose.ymlを使用してRailsプロジェクトを作成しました。 docker-compose.ymlはバージョン3です。
  • docker build -t <project name> .またはdocker-compose up --buildで画像が正常に構築されました
  • コンテナが起動し、正常に実行されます。
  • Docker-compose downで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
32
Parth Modi

問題を修正することができました。不明な問題のため、ubuntuのApparmorサービスは正常に動作していませんでした。この問題は、mobyプロジェクトで報告された問題に似ていました https://github.com/moby/moby/issues/20554

/etc/apparmor.d/tunablesフォルダーは空で、 https://github.com/mlaventure は、apparmorをパージ/再インストールして初期状態に戻すことを提案しました。

だから私はapparmorを再インストールし、再起動後に問題が解決しました。

お役に立てれば。

13
Parth Modi

AppArmorを完全に消去したくない人向け。

ステータスを確認:Sudo aa-status

シャットダウンして、再起動を防ぎます:Sudo systemctl disable apparmor.service --now

AppArmorプロファイルのアンロード:Sudo service apparmor teardown

ステータスを確認:Sudo aa-status

これで、コンテナを停止/強制終了できます。

85
jsloan117

スナップパッケージからDockerをインストールし、しばらくして、aptリポジトリのインストールに移行することにしました。

私は同じ問題に直面していたので、Sudo aa-remove-unknownを使用するとうまくいきました。

そのため、Apparmorの再インストールは必要ありませんでした。

32
Alejandro S.

問題を直接修正するには、コンテナで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を再インストールするソリューションの便利な代替手段です。

4
Moritz

私の場合、問題は、競合するドッカーのインストールがあることでした:docker自体は公式の docker-ce package ですが、Ubuntuスナップパッケージからはdocker-composeです。

公式githubからdocker-composeを正しくインストールすると( 手順はこちら )うまくいきました。また、 Linuxのインストール後の指示 に従いましたが、それも助けたかもしれません(非rootユーザーとしてdockerを実行するため)

ここでAppArmorをそのまま残しました-触れませんでした。

2
user3929660