为什么docker-compose创建的目录/文件的用户:组为999:999?

16

我使用以下的 docker-compose.yml文件, 运行命令docker-compose up

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-compose:1.22.0


您是否正在 Windows 系统中构建非 Windows 容器? - Nordle
@MattB。我的主机是Ubuntu-18.04。 - Marinos An
4个回答

13

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。由于您正在从容器到主机创建一个绑定卷,该卷中的所有文件必须对于相同的uid具有相同的权限。在我的测试机上,Docker的guid为999,这就是为什么在主机端以这种方式显示的原因。

至于“修复”这个问题,您可以在Dockerfile中使用(主机级别)已知的uid而不是默认值,或者您可以忽略它,因为它正如预期的那样工作,除非您在主机系统中希望为某个特定的uid显示特定名称。


2

Our Dockerfile has lines like

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相同。最初的回答。

1
这是您的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"

每次运行容器时都会执行此命令。
为确保,请尝试:
docker run exec -ti <nameOfContainer|containerHash> bash -c "id mysql"

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


这将导致数据库无法启动:容器只会运行chmod命令,然后退出。 - David Maze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接