web-dev-qa-db-ja.com

Windowsホストのdockerコンテナー内のマウントされたフォルダーのファイル許可を変更する

免責事項/編集2

数年後、この質問を読んでいるすべての人のために-あなたがWindows上でLinuxコンテナでドッカーを使用したい場合は、Windows用のドッカーをまったく使用せず、代わりにVM完全にこのExt3 NTFSの問題は、非常に多くの異なるレベルであなたの首を骨折し、docker-machineをインストールすることさえ努力する価値さえないかもしれません。


編集:

私は docker-machine を使用しています。これはVirtualbox内でboot2dockerインスタンスを開始しますVM/c/Usersの共有フォルダーを使用して、ボリュームをマウントできます上記のボリュームのアクセス許可は質問の対象ですVMは/c/Users/tom/.docker/に保存されます

Hyper-Vよりもdocker-machine Virtualboxワークフローを使用することを選択しました。毎日のワークフローでVBoxが必要であり、Hyper-VとVirtualboxを1つのシステムで同時に実行することは異なるHypervisor間の非互換性のため不可能であるためです.

元の質問

現在、Windows上のコンテナーでPHPMyAdminをセットアップしようとしていますが、config.inc.phpファイルのアクセス許可を変更できません。

私は見つけました: Dockerコンテナー(WindowsのDocker)内でchownを呼び出すことはできません これは多少関連しているかもしれないと考えましたが、MongoDBにのみ適用されるようです。

これは私のdocker-compose.ymlです

    version: "3"

    services:
      pma:
        image: (secrect company registry)/phpmyadmin
        ports: 
          - 9090:80
        volumes:
          - /c/Users/tom/projects/myproject/data/var/www/public/config.inc.php:/var/www/public/config.inc.php

今、私はdocker exec -it [container] bashとマウントされたディレクトリを変更するとき、config.inc.phpchmodを実行しようとしますが、何らかの理由で失敗します

root@22a4bag43245: ls -la config.inc.php
-rw------- 1 root root 0 Aug 11 15:11 config.inc.php
root@22a4bag43245: chmod 655 config.inc.php
root@22a4bag43245: ls -la config.inc.php
-rw------- 1 root root 0 Aug 11 15:11 config.inc.php

リンクされた答えを考慮して、私は自分のUserhomeからボリュームを移動できると思ったが、vboxはフォルダーをまったくマウントしません。

/var/www/public/config.inc.phpのファイル許可を永続的に変更するにはどうすればよいですか?

6
Tom M

chownを使用した後でも所有権を変更できないという同じ問題がありました。そして、私が 研究済み であったのは、NTFSボリュームがextファイルシステム内にマウントされていたためです。そこで、別のアプローチを使用しました。

Docker内部のボリュームには、これらの問題はありません。したがって、内部のdockerボリュームにファイルをマウントし、ローカルフォルダー内の任意の場所にそのファイルへのハードシンボリックリンクを作成できます。

Sudo ln $(docker volume inspect --format '{{ .Mountpoint }}' <project_name>_<volume_name>) <absolute_path_of_destination>

このようにして、ファイルをdocker内の任意の場所に配置し、許可の問題を発生させることなく、ハードシンボリックリンクによる通常のボリュームマウントのようにファイルの内容を変更できます。

ここ は、ディレクトリをマウントおよびリンクするこのプロセスの実装です。詳細について知りたい場合は、 issuepossible fixセクションを参照してください。

[〜#〜] edit [〜#〜]

このアプローチを実装する手順:

  1. 関係するファイルを内部docker-volume(別名named volumes)にマウントします。
  2. ハードリンクを作成する前に、ボリュームと関連ファイルがそこに存在することを確認してください。これを確実にするには、少なくとも一度前にコンテナを実行する必要があります。または、このファイル作成を自動化する場合は、必要なファイルを作成して終了するdocker runを含めることができます。

    docker run --rm -itd \ -v "<Project_name>_<volume_name>:/absolute/path" \ <image> bash -c "touch /absolute/path/<my_file>"

このdocker runは、ボリュームと必要なファイルを作成します。ここで、containerは私のプロジェクト名です。デフォルトでは、プロジェクトが存在するフォルダーの名前であり、<volume_name>は元のコンテナーで使用するものと同じです。 <image>は、元のコンテナで既に使用されているものと同じにすることができます。

  1. OSに、システム上の実際のファイルの場所へのハードリンクを作成します。 docker volume inspect --format '{{ .Mountpoint }}' <project_name>_<volume_name>/<my_file>を使用してファイルの場所を見つけることができます。 Linuxユーザーはターミナルでlnを使用でき、Windowsユーザーはコマンドプロンプトでmklinkを使用できます。

ステップ3では、/absolute/pathは既にその場所を参照しているので、<volume_name>は使用していません。ファイルを参照するだけです。

9
Ayushya

次のいずれかを試してください。

  1. イメージimageを再構築できる場合:image: (secrect company registry)/docker-stretchimal-Apache2-php7-pmaそしてdockerファイル内に、以下を追加します

    USER root RUN chmod 655 config.inc.php

その後、イメージを再構築し、レジストリにプッシュすることができます。これで、実行していたことが機能するはずです。新しいコンテナを起動するたびにアクセス許可を手動で変更したくないので、これは優先ソリューションです。

  1. ユーザールートを明示的に使用して実行してみてください

    docker exec -it -u root [container] bash

3
yamenk