我使用的是docker compose v 1.27和docker v 19.03。我的docker-compose.yml文件中有这个。。。
version: '3'
services:
mysql:
restart: always
image: mysql:8.0
cap_add:
- SYS_NICE # CAP_SYS_NICE
environment:
MYSQL_DATABASE: 'directory_data'
# So you don't have to use root, but you can if you like
MYSQL_USER: 'root'
# You can use whatever password you like
MYSQL_PASSWORD: 'password'
# Password for root access
MYSQL_ROOT_PASSWORD: 'password'
MYSQL_ROOT_HOST: '%'
ports:
- "3406:3306"
volumes:
- my-db:/var/lib/mysql
- ./mysql/mysqlconf:/etc/mysql/conf.d
command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']
请注意,我没有Dockerfile(我认为我不需要它(。我的"my.cnf";文件,位于下方
davea$ cat mysql/mysqlconf/my.cnf
bind-address = 0.0.0.0
在Docker中,如何将my.cnf文件的权限设置为只读?这在Windows 10上发挥作用;码头工人组成";导致此警告
mysqld: [Warning] World-writable config file '/etc/mysql/conf.d/my.cnf' is ignored.
注意,这个答案——https://stackoverflow.com/questions/64327260/in-docker-compose-how-do-i-set-perms-on-a-my-cnf-file-if-i-dont-have-a-dockerf,不剪切它,因为它依赖于设置
我认为这里的根本问题是在ext文件系统中安装NTFS目录卷。以下是一些可能有用的解决方案。
Docker级别:使用只读卷安装
您可以使用只读卷装载,而不是默认的读写设置。
例如,将:ro
(只读(添加到卷规范的末尾:
volumes:
- ...
- ./mysql/mysqlconf:/etc/mysql/conf.d:ro
容器级别:chmod
配置文件
如果要取消显示警告,可以尝试通过将command
配置扩展到多个命令,将运行时文件的权限设置为只读。不过,我认为这就是您所说的客户端操作系统级别。装载不会是只读的。
例如:
command: bash -c "
chmod -R 0444 /etc/mysql/conf.d/ &&
mysqld --user=root --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
"
请注意,这与只读装载不兼容,因为它是只读文件系统,因此无法调整权限。
在docker compose yaml文件中,可以通过在卷定义末尾添加:ro
来定义对已装入卷的只读访问
。
version: '3'
services:
mysql:
restart: always
image: mysql:8.0
cap_add:
- SYS_NICE # CAP_SYS_NICE
environment:
MYSQL_DATABASE: 'directory_data'
# So you don't have to use root, but you can if you like
MYSQL_USER: 'root'
# You can use whatever password you like
MYSQL_PASSWORD: 'password'
# Password for root access
MYSQL_ROOT_PASSWORD: 'password'
MYSQL_ROOT_HOST: '%'
ports:
- "3406:3306"
volumes:
- my-db:/var/lib/mysql
- ./mysql/mysqlconf:/etc/mysql/conf.d:ro
command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']
我建议您在自定义入口点脚本中设置权限。这确保了它们在每次容器启动时都被调整;官方的";mysql镜像(它有自定义的入口点脚本支持(,并且与docker最佳实践不冲突(保持mysqld
以pid 1的形式运行(。
这是三个步骤。
-
创建一个脚本,进行所有必要的调整并使其可执行:
cat <<EOF > ./adjust-permissions.sh #!/bin/sh set -ex chown -R root:root /etc/mysql/conf.d/ chmod -R 0644 /etc/mysql/conf.d/ EOF chmod +x ./adjust-permissions.sh
您可能想忽略
chown
,就我个人而言,我希望确保挂载的文件不会出现意外。 -
将其装入容器内的
/docker-entrypoint-initdb.d/
(参见docker-entrypoint.sh
(:volumes: [...] - ./adjust-permissions.sh:/docker-entrypoint-initdb.d/adjust-permissions.sh
-
享受吧。