14

我使用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

4 回答 4

12

mysqlDocker使用映像使用的用户创建并填充目录。当然,该用户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拥有uid999。并且当您创建从容器到主机的绑定卷时,该卷中的所有文件必须对相同uid的 s 具有相同的权限。在我的测试机器上,docker 有guid999,这就是它在主机端显示的原因。

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

于 2019-03-19T13:04:05.967 回答
2

我们的 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是一样的。

于 2019-03-19T13:13:12.127 回答
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"

每次您run使用容器时都会执行此操作。

可以肯定的是,请尝试:

docker run exec -ti <nameOfContainer|containerHash> bash -c "id mysql"
于 2019-03-19T13:05:52.593 回答
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(将目录更改为您需要的目录)

于 2019-03-19T13:01:09.847 回答