为什么Docker-Compose与用户创建目录/文件:组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选择创建文件使用 non-escisting UID:gid

就我而言,除非更改所有权,否则我无法提交特定目录。但是,即使我这样做,在下一次运行中,docker-compose up再次将所有权更新为999:999

解决上述问题的解决方案是什么?例如有没有一种方法可以指示Docker-Compose用特定的UID映射主机中的文件:GID对?

主机:ubuntu-18.04
Docker-Compose:1.22.0

Docker与mysql Image使用的用户创建并填充目录。当然,该用户在容器中具有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 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-Compose的用户的UID和GID相同。

这是您的docker映像的构建的文件:

在Dockerfile中您可以阅读:

RUN groupadd -r mysql && useradd -r -g mysql mysql

创建可能拥有您所看到的UID/GID夫妇的用户。

and在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时,在docker-compose.yaml文件中添加入口点以对您进行递归权限更改(将目录更改为您需要的内容)

最新更新