【问题标题】:Why docker-compose creates directories/files with user:group 999:999?为什么 docker-compose 使用 user:group 999:999 创建目录/文件?
【发布时间】:2019-08-10 00:12:05
【问题描述】:

我使用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
码头工人撰写:1.22.0

【问题讨论】:

  • 您是在 windows 系统中构建非 windows 容器吗?
  • @MattB。我的主机是 ubuntu-18.04。

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


【解决方案1】:

我可以建议修复;

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命令然后退出。
【解决方案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 拥有999 个uid。当您创建从容器到主机的绑定卷时,该卷中的所有文件必须对相同的uids 具有相同的权限。在我的测试机器上,docker 有 999 个 guid,这就是它在主机端显示的原因。

至于“修复”这个问题,您可以在 dockerfile 中使用(主机级别)已知的uid 而不是默认的,或者您可以忽略它,因为它完全按照预期工作,除非有您希望它在主机系统中为某个uid 显示某个名称的具体原因。

【讨论】:

    【解决方案3】:

    我们的 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外部运行docker-compose的用户的uid和gid是一样的。

    【讨论】:

      【解决方案4】:

      以下是构建 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"
      

      【讨论】:

        猜你喜欢
        • 2013-10-06
        • 2022-08-18
        • 2022-01-07
        • 1970-01-01
        • 2016-08-22
        • 2014-10-12
        • 1970-01-01
        • 1970-01-01
        • 2021-07-29
        相关资源
        最近更新 更多