我将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
答案 0 :(得分:2)
Docker使用mysql
映像使用的用户创建并填充目录。该用户当然在容器中有一个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
的{{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"