docker-compose up
と次のdocker-compose.yml
を使用しました
version: '3.5'
services:
mysql-server:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=root_pwd
volumes:
- ./var/lib/mysql:/var/lib/mysql:rw
ディレクトリ./var/lib/mysql
は最初は存在しません。
docker-compose up
を実行した後.
ls -al ./var/lib/mysql
コマンドは、user:group
999:999
を含むすべてのファイルを表示します。
システムに999
というユーザーまたはグループが見つかりません。
理由docker-compose
はファイルの作成に存在しないuid:gidを選択しますか?
私の場合、所有権を変更しない限り、特定のディレクトリをコミットできません。ただし、その場合でも、次回の実行時に、docker-compose up
は所有権を999:999
に再度更新します。
上記の問題の解決策は何ですか?例えばホストマシンのファイルを特定のuid:gidペアでマップするようにdocker-composeに指示する方法はありますか?
ホスト:ubuntu-18.04
docker-compose:1.22.0
Dockerは、ディレクトリを作成し、mysql
イメージが使用するユーザーを入力します。もちろん、そのユーザーはコンテナ内にuid
を持っています。 uid
はたまたま999です。
そのuid
を持つユーザーはコンテナに存在しますが、ホストには存在しません。
コンテナーでは、フォルダーは次のようになります。
root@f86ffddac96c:/var/lib# ls -l
total 32
...
drwxr-xr-x 5 mysql mysql 4096 Mar 19 13:06 mysql
...
ホスト上では、このように見えます。
root@machine:/home/username/mysql/var/lib# ls -l
total 4
drwxr-xr-x 5 999 docker 4096 Mar 19 15:06 mysql
これは単に、ユーザーmysql
のuid
が999であることを意味します。また、コンテナーからホストへのバインドボリュームを作成しているため、そのボリューム内のすべてのファイルには、同じuid
s。私のテストマシンでは、dockerのguid
は999です。これが、ホスト側にそのように表示される理由です。
これを「修正する」ことについては、デフォルトのものの代わりにdockerfileで(ホストレベルの)既知のuid
を使用するか、または意図したとおりに機能している場合を除き、単に無視することができます。ホストシステムで特定のuid
の特定の名前を表示する特定の理由。
Dockerfileには次のような行があります
ARG uid=1000
ARG gid=1000
RUN groupadd -g $gid myuser && useradd -lm -u $uid -g $gid myuser
USER myuser
次に、
docker-compose build --build-arg uid=`id -u` --build-arg gid=`id -g` mydocker
そのため、Docker内で作成されたユーザーのuidとgidは、Dockerの外部でdocker-composeを実行しているユーザーのuidとgidと同じになります。
Dockerイメージが構築されているファイルは次のとおりです: https://github.com/docker-library/mysql/tree/bb7ea52db4e12d3fb526450d22382d5cd8cd41ca/5.7
Dockerfileで次を読み取ることができます。
RUN groupadd -r mysql && useradd -r -g mysql mysql
これにより、表示されているUID/GIDの組み合わせを持つユーザーが作成されます。
そして、entrypoint.shファイルには、
chown -R mysql:mysql "$DATADIR"
これは、コンテナをrun
するたびに実行されます。
確かに、試してください:
docker run exec -ti <nameOfContainer|containerHash> bash -c "id mysql"
修正を提案できます。
version: '3.5'
services:
mysql-server:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=root_pwd
volumes:
- ./var/lib/mysql:/var/lib/mysql:rw
entrypoint: chmod -R 755 /var && tail -f /dev/null
docker-compose.yaml
ファイルにエントリポイントを追加して、docker compose
の実行時に再帰的なアクセス許可を変更します(ディレクトリを必要なものに変更します)