2

これdocker-compose.yml:

services:
  database:
    image: mongo:3.2
    ports:
      - "27017"
    command: "mongod --dbpath=/usr/database"
    networks:
      - backend
    volumes:
      - dbdata:/usr/database

volumes:
  dbdata:

このエラーが発生します(抜粋):

database_1  | 2016-11-28T06:30:29.864+0000 I STORAGE  [initandlisten] exception in initAndListen: 98 Unable to create/open lock file: /usr/database/mongod.lock errno:13 Permission denied Is a mongod instance already running?, terminating

そのイメージを直接使用してコンテナーでコマンドを実行しようとするだけの場合も同様です。

$ docker run -v /usr/database mongo:3.2 mongod --dbpath=/usr/database

しかし、/bin/bashコンテナーの開始時に実行して THEN startを実行すると、mongo問題ありません。

$ docker run -it -v /usr/database mongo:3.2 /bin/bash
root@8aab722fad89:/# mongod --dbpath=/usr/database

出力に基づくと、違いは、2 番目のシナリオでは、コマンドが root として実行されることです。

だから、私の質問は次のとおりです。

  1. 他の方法は機能しないのに、なぜこの方法は機能するの/bin/bashでしょうか?
  2. docker-compose でその理由を再現するにはどうすればよいですか?

注:OSXでは、Mongoが使用するボリュームとしてホストディレクトリをマウントできるかどうかに影響するように見えるため、私はそうしていません。

4

1 に答える 1

2

明確にするために、このイメージ  hub.docker.com/_/mongoは DockerHub からの公式の MongoDB Docker イメージですが、MongoDB からの公式の Docker イメージではありません。

今、あなたの質問に答えるために、

他の方法は機能しないのに、なぜこの 方法は機能するの/bin/bash でしょうか?

この回答はDockerfile v3.2に基づいています。-v /usr/database最初に、ボリューム マウント コマンドは、基本的にルート所有権を持つコンテナー内にディレクトリを作成していることを指摘します。

permission deniedDockerイメージがユーザーとしてコマンドを実行しているため、以下のコマンドは失敗しましたmongodb(この dockerfile 行を参照してください)。ディレクトリの/usr/database所有者はroot.

$ docker run -v /usr/database mongo:3.2 mongod --dbpath=/usr/database

以下を実行する場合は/bin/bash、手動で実行しますmongod

$ docker run -it -v /usr/database mongo:3.2 /bin/bash

としてログインし、 としてroot実行mongodrootており、 でデータベース ファイルを作成する権限を持っています/usr/database/

/data/dbまた、以下の行を実行している場合は、ユーザーのアクセス許可が修正されたディレクトリを指しているため機能しますmongodb(この dockerfile 行を参照してください) 。

$ docker run -v db:/data/db mongo:3.2

docker-compose でその理由を再現するにはどうすればよいですか?

最も簡単な解決策はcommand: "mongod --dbpath=/data/db"、Dockerfile でアクセス許可の所有権が修正されているため、使用することです。

ホスト ボリュームを使用する場合は、おそらくmongodbホスト OSX にユーザーを追加し、適切なディレクトリのアクセス許可を変更する必要があります。ボリューム マウントのパーミッション所有権の変更は、docker-composeの範囲外です。

于 2016-11-29T01:19:47.360 に答える