为什么 docker-compose 使用 user:group 999:999 创建 directories/files?

Why docker-compose creates directories/files with 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

以上问题的解决方法是什么?例如有没有办法指示 docker-compose 使用特定的 uid:gid 对映射主机中的文件?

主持人:ubuntu-18.04
docker-撰写:1.22.0

我可以提出修复建议;

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(将目录更改为您需要的目录)时为您更改递归权限

Docker 使用 mysql 图像使用的用户创建并填充目录。当然,该用户在容器中有一个 uiduid 恰好是 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。当您创建从容器到主机的绑定卷时,该卷中的所有文件必须具有相同的相同权限uid秒。在我的测试机上 docker 有 guid 999,这就是它在主机端显示的原因。

至于 "fixing" 这个你可以在 docker 文件中使用一个(主机级别)已知的 uid 而不是默认的,或者你可以忽略它,因为它完全按预期工作,除非有特定原因您希望它在您的主机系统中为某个 uid 显示某个名称。

以下是您的 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"

我们的 Docker 文件有类似

的行
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就和运行里面的用户uid和gid一样了docker-compose在Docker外面=].