web-dev-qa-db-ja.com

docker-composeがuser:group 999:999でディレクトリ/ファイルを作成するのはなぜですか?

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:group999:999を含むすべてのファイルを表示します。

システムに999というユーザーまたはグループが見つかりません。

理由docker-composeファイルの作成存在しないuid:gidを選択しますか?

私の場合、所有権を変更しない限り、特定のディレクトリをコミットできません。ただし、その場合でも、次回の実行時に、docker-compose upは所有権を999:999に再度更新します。

上記の問題の解決策は何ですか?例えばホストマシンのファイルを特定のuid:gidペアでマップするようにdocker-composeに指示する方法はありますか?

ホスト:ubuntu-18.04
docker-compose:1.22.0

9
Marinos An

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

これは単に、ユーザーmysqluidが999であることを意味します。また、コンテナーからホストへのバインドボリュームを作成しているため、そのボリューム内のすべてのファイルには、同じuids。私のテストマシンでは、dockerのguidは999です。これが、ホスト側にそのように表示される理由です。

これを「修正する」ことについては、デフォルトのものの代わりにdockerfileで(ホストレベルの)既知のuidを使用するか、または意図したとおりに機能している場合を除き、単に無視することができます。ホストシステムで特定のuidの特定の名前を表示する特定の理由。

5
Christian W.

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と同じになります。

2
RemcoGerlich

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"
0
Louis Delfieux

修正を提案できます。

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の実行時に再帰的なアクセス許可を変更します(ディレクトリを必要なものに変更します)

0
Nordle