为什么docker-compose使用user:group 999:999创建目录/文件?

时间:2019-03-19 12:49:06

标签: docker docker-compose docker-volume file-ownership

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

4 个答案:

答案 0 :(得分:2)

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

这仅表示用户mysql的{​​{1}}为999。在您创建从容器到主机的绑定卷时,该卷中的所有文件必须对同一{{ 1}} s。在我的测试机上,docker的uid为999,这就是为什么它在主机端显示为这样的原因。

对于“修复”,您可以在dockerfile中使用已知的(主机级别)uid而不是默认文件,也可以忽略它,因为它可以按预期工作,除非出于某些特定原因,您希望它在主机系统中显示特定guid的特定名称。

答案 1 :(得分:1)

我们的Dockerfile中有这样的行

DECLARE @Test TABLE (
    Field   VARCHAR(32)
)



 INSERT @Test( Field )
    VALUES
    ('MYNAME'),
    ('MYNAME5'),
    ('MYNAME12'),
    ('MYNAME275'),
    ('MYNAME275TEXT')


SELECT *
FROM @Test
WHERE (
    (   Field = 'MYNAME' 
        OR Field LIKE 'MYNAME[0-9]%'
    )
    AND Field NOT LIKE 'MYNAME[0-9]%[^0-9]%'
    )

然后我们用

构建
ARG uid=1000
ARG gid=1000
RUN groupadd -g $gid myuser && useradd -lm -u $uid -g $gid myuser
USER myuser

因此,在Docker内部创建的用户的uid和gid与在Docker外部运行docker-compose的用户的uid和gid相同。

答案 2 :(得分: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时为您进行递归权限更改(将目录更改为所需的目录)

答案 3 :(得分:0)

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