我使用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使用的用户创建并填充目录。当然,该用户在容器中具有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
的uid
共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
文件中添加入口点以对您进行递归权限更改(将目录更改为您需要的内容)