[解決済み] Docker共有ボリュームのパーミッションを管理する(最良の)方法は何ですか?
質問
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 がどのように対応するかは気にしないことにします。
graphite
と
graphitetools
コンテナを使用することができます。これらのコンテナはどのホストにもデプロイできるようになり、完全に動作し続けるようになりました。
これのすてきなところは
graphitetools
には、あらゆる種類の便利なユーティリティやスクリプトがあり、それらをポータブルな方法でデプロイすることも可能です。
アップデイト2 : この回答を書いた後、私は より詳細なブログ記事 この方法について お役に立てれば幸いです。
UPDATE 3 : この回答を訂正し、より具体的な内容を追加しました。所有権は通常、ボリュームの作成時、つまりデータコンテナで割り当てられるからです。参照 このブログ . これは必須ではありませんが -- データコンテナを "reference/handle" として使用し、エントリポイントで chown を介して別のコンテナに所有権とパーマを設定し、gosu で終了して正しいユーザとしてコマンドを実行することができます。もし、この方法に興味がある方がいらっしゃいましたら、コメントいただければ、この方法を使ったサンプルへのリンクを提供できます。
関連
-
[解決済み] docker: ドライバがエンドポイントウェブサーバの外部接続のプログラミングに失敗しました。
-
docker use error: input device is not a TTY
-
DockerRegistryV2 イメージの削除
-
[解決済み] Dockerでデータベースなどの永続的なストレージを扱う方法
-
[解決済み] 既存のDockerコンテナにボリュームを追加するにはどうすればよいですか?
-
[解決済み] ボリュームに単一ファイルをマウントする方法
-
[解決済み】Dockerイメージとコンテナの違いは何ですか?
-
[解決済み】ビルド中にDockerfileでホストボリュームをDockerコンテナにマウントする方法
-
[解決済み】docker composeでホストディレクトリをボリュームとしてマウントする方法
-
[解決済み】Dockerにボリュームを追加しても、サブフォルダを除外してしまう。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】apt-get でインストールしても docker コマンドが見つからない。
-
[解決済み] Docker - コンテナが実行されていません
-
[解決済み] docker-compose down default_network エラー
-
[解決済み] 複数のディレクトリを1つのコマンドでコピーする
-
Docker npm getaddrinfo EAI_AGAIN registry.npmjs.org registry.npmjs.org:443
-
企業向けWeChatアラート監視のためのPrometheus+Grafana+AlertmanagerのDockerインストール
-
bashでの解決方法 : docker :コマンドが見つかりません。
-
dockerのmountコマンドでエラーになる: mount: permission denied
-
[解決済み] Dockerでデータベースなどの永続的なストレージを扱う方法
-
[解決済み] Dockerです。unix:///var/run/docker.sock にある Docker デーモン ソケットに接続しようとしたときに、パーミッションが拒否されました。