免責事項/編集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.php
でchmod
を実行しようとしますが、何らかの理由で失敗します。
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
のファイル許可を永続的に変更するにはどうすればよいですか?
chown
を使用した後でも所有権を変更できないという同じ問題がありました。そして、私が 研究済み であったのは、NTFSボリュームがextファイルシステム内にマウントされていたためです。そこで、別のアプローチを使用しました。
Docker内部のボリュームには、これらの問題はありません。したがって、内部のdockerボリュームにファイルをマウントし、ローカルフォルダー内の任意の場所にそのファイルへのハードシンボリックリンクを作成できます。
Sudo ln $(docker volume inspect --format '{{ .Mountpoint }}' <project_name>_<volume_name>) <absolute_path_of_destination>
このようにして、ファイルをdocker内の任意の場所に配置し、許可の問題を発生させることなく、ハードシンボリックリンクによる通常のボリュームマウントのようにファイルの内容を変更できます。
ここ は、ディレクトリをマウントおよびリンクするこのプロセスの実装です。詳細について知りたい場合は、 issue のpossible fix
セクションを参照してください。
[〜#〜] edit [〜#〜]
このアプローチを実装する手順:
named volumes
)にマウントします。ハードリンクを作成する前に、ボリュームと関連ファイルがそこに存在することを確認してください。これを確実にするには、少なくとも一度前にコンテナを実行する必要があります。または、このファイル作成を自動化する場合は、必要なファイルを作成して終了する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>
は、元のコンテナで既に使用されているものと同じにすることができます。
docker volume inspect --format '{{ .Mountpoint }}' <project_name>_<volume_name>/<my_file>
を使用してファイルの場所を見つけることができます。 Linuxユーザーはターミナルでln
を使用でき、Windowsユーザーはコマンドプロンプトでmklink
を使用できます。ステップ3では、/absolute/path
は既にその場所を参照しているので、<volume_name>
は使用していません。ファイルを参照するだけです。
次のいずれかを試してください。
イメージimageを再構築できる場合:image: (secrect company registry)/docker-stretchimal-Apache2-php7-pma
そしてdockerファイル内に、以下を追加します
USER root RUN chmod 655 config.inc.php
その後、イメージを再構築し、レジストリにプッシュすることができます。これで、実行していたことが機能するはずです。新しいコンテナを起動するたびにアクセス許可を手動で変更したくないので、これは優先ソリューションです。
ユーザールートを明示的に使用して実行してみてください
docker exec -it -u root [container] bash