1. ホーム
  2. docker

[解決済み] Docker共有ボリュームのパーミッションを管理する(最良の)方法は何ですか?

2022-03-24 19:07:34

質問

Dockerを使い始めてしばらく経ちますが、永続的なデータを扱うときに同じ問題が発生します。

私は Dockerfile ボリュームを露出させる を使用するか --volumes-from から コンテナ内にホストフォルダをマウントする .

ホスト上の共有ボリュームにどのようなパーミッションを適用すればよいですか?

2つの選択肢が考えられますね。

  • 今のところ、全員に読み取り/書き込みのアクセス権を与えているので、Dockerコンテナからフォルダに書き込むことは可能です。

  • ホストからコンテナにユーザーをマッピングし、より詳細なパーミッションを割り当てることができるようにします。しかし、これが可能かどうかはわかりませんし、それに関する情報もあまり見当たりません。今のところ、私ができることは、コンテナをあるユーザとして実行することだけです。 docker run -i -t -user="myuser" postgres しかし、このユーザーは私のホストとは異なるUIDを持っています。 myuser そのため、パーミッションが機能しません。また、ユーザーをマッピングすることで、セキュリティ上のリスクが発生しないか不安です。

他の選択肢はありますか?

皆さんは、この問題にどのように対処していますか?

解決方法は?

アップデート 2016-03-02 : Docker 1.9.0では、Dockerが 名前付きボリューム どの データ専用コンテナを置き換える . 下記の回答や、リンク先のブログ記事も、まだ価値があるのは、以下の意味です。 dockerの中でデータをどう考えるか が、データコンテナではなく、名前付きボリュームを使用して、以下に説明するパターンを実装することを検討してください。


これを解決するための正規の方法は データ専用コンテナ . この方法では、ボリューム・データへのすべてのアクセスは、コンテナで -volumes-from データコンテナであるため、ホストの uid/gid は重要ではありません。

例えば、ドキュメントに記載されている使用例の1つに、データボリュームのバックアップがあります。これを行うには、別のコンテナを使用して、バックアップを行うために tar であり、これも -volumes-from を使用して、ボリュームをマウントします。つまり、ホスト上のデータに適切なパーミッションでアクセスする方法を考えるのではなく、バックアップやブラウジングなど、必要なことを行う方法を考えることが重要なのです。-- 別のコンテナを使ってね。コンテナ自体は一貫したuid/gidを使用する必要がありますが、ホスト上の何かにマッピングする必要はなく、それによってポータブルな状態を保つことができます。

これは私にとっても比較的新しいことですが、もし特定の使用例があれば、遠慮なくコメントいただければ、回答を拡大するようにします。

アップデイト : コメントで指定されたユースケースに対して、画像 some/graphite を実行するためのイメージと、グラファイトを実行するための some/graphitedata をデータコンテナとして使用します。つまり、ポートなどを無視して Dockerfile イメージの some/graphitedata は、こんな感じです。

FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
  && useradd -r -g graphite graphite
RUN mkdir -p /data/graphite \
  && chown -R graphite:graphite /data/graphite
VOLUME /data/graphite
USER graphite
CMD ["echo", "Data container for graphite"]

データコンテナを構築し、作成する。

docker build -t some/graphitedata Dockerfile
docker run --name graphitedata some/graphitedata

some/graphite Dockerfileも同じuid/gidを取得する必要があるため、以下のような感じになります。

FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
  && useradd -r -g graphite graphite
# ... graphite installation ...
VOLUME /data/graphite
USER graphite
CMD ["/bin/graphite"]

そして、次のように実行されることになる。

docker run --volumes-from=graphitedata some/graphite

これで、グラファイトコンテナとそれに関連するデータ専用コンテナが正しいユーザ/グループで作成されました。 some/graphite コンテナをデータコンテナにも使用し、実行時にエントリポイント/cmd をオーバーライドしますが、これらを別々のイメージとして持つことは、IMO では明確です)。

さて、dataフォルダの中の何かを編集したいとします。そこで、ボリュームをホストにマウントしてそこで編集するのではなく、新しいコンテナを作成して、その作業を行います。これを some/graphitetools . また、適切なユーザー/グループを作成しましょう。 some/graphite の画像が表示されます。

FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
  && useradd -r -g graphite graphite
VOLUME /data/graphite
USER graphite
CMD ["/bin/bash"]

を継承することで、DRYにすることができます。 some/graphite または some/graphitedata を Dockerfile に追加するか、あるいは新しいイメージを作成する代わりに既存のイメージを再利用します (必要に応じてエントリポイント/cmd をオーバーライドします)。

あとは、実行するだけです。

docker run -ti --rm --volumes-from=graphitedata some/graphitetools

で、次に vi /data/graphite/whatever.txt . すべてのコンテナには、uid/gidが一致する同じGraphiteユーザーがいるため、これは完全に動作します。

マウントしないので /data/graphite の中で定義された uid/gid とホストの uid/gid がどのように対応するかは気にしないことにします。 graphitegraphitetools コンテナを使用することができます。これらのコンテナはどのホストにもデプロイできるようになり、完全に動作し続けるようになりました。

これのすてきなところは graphitetools には、あらゆる種類の便利なユーティリティやスクリプトがあり、それらをポータブルな方法でデプロイすることも可能です。

アップデイト2 : この回答を書いた後、私は より詳細なブログ記事 この方法について お役に立てれば幸いです。

UPDATE 3 : この回答を訂正し、より具体的な内容を追加しました。所有権は通常、ボリュームの作成時、つまりデータコンテナで割り当てられるからです。参照 このブログ . これは必須ではありませんが -- データコンテナを "reference/handle" として使用し、エントリポイントで chown を介して別のコンテナに所有権とパーマを設定し、gosu で終了して正しいユーザとしてコマンドを実行することができます。もし、この方法に興味がある方がいらっしゃいましたら、コメントいただければ、この方法を使ったサンプルへのリンクを提供できます。