为什么 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:group
999: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
图像使用的用户创建并填充目录。当然,该用户在容器中有一个 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
秒。在我的测试机上 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外面=].
我将 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
。
以上问题的解决方法是什么?例如有没有办法指示 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
图像使用的用户创建并填充目录。当然,该用户在容器中有一个 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
秒。在我的测试机上 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外面=].