podman 映射windows本地目录,运行docker-compose.yml启动MySQL容器
services:
mysql:
image: mysql:8.0.32
container_name: mysql8
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=1234ksdk
- TZ=Asia/Shanghai
networks:
- default
ports:
- '3306:3306'
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf/my.cnf:/etc/my.cnf
出现:不能设置ca.pem权限错误,导致MySQL容器启动失败。
mysqld: Cannot change permissions of the file 'ca.pem' (OS errno 1 - Operation not permitted)
[ERROR] [MY-010295] [Server] Could not set file permission for ca.pem
原因是:
podman和docker不一样,docker是默认以root权限运行的,这也是docker一直被诟病有安全风险的原因,而podman是rootless 普通用户运行,所以会出现权限不足的问题。
MySQL 进程需要以 root 权限模式运行,才能从podman machine虚拟机操作windows主机文件系统(请注意,在rootful的root权限模式下,MySQL进程可以在Windows文件系统下写入ca.pem,但在尝试更改 ca.pem 的文件权限时会失败)。如果不想以rootful(root 权限模式)运行podman machine虚拟机,可以使用podman machine虚拟机文件系统作为 MySQL 数据文件夹(在这种情况下需要将虚拟挂载卷标记z,如 -v /tmp/mysql_data:/var/lib/mysql:z):
解决方法有两种:
1、不使用Windows本地文件系统作为挂载卷,使用podman machine的虚拟文件
> podman machine ssh mkdir /tmp/mysql_data
> podman run --name mysql-container -e MYSQL_ROOT_PASSWORD=my_sql_pwd -d -p 3306:3306 -v /tmp/mysql_data:/var/lib/mysql:z mysql:latest
2、使用Windows本地文件系统作为挂载卷,将podman machine设置成rootful模式,使podman获得root权限并且挂载卷不能标记为z,同时设置--user 1000:1000
在 Docker 中,z 和 Z 是用于配置 SELinux 标签 的选项,主要用于绑定挂载(Bind Mounts)时的安全性管理。这些选项会影响主机文件或目录的 SELinux 标签,从而控制容器对挂载内容的访问权限。
z 和 Z 的区别
z 选项:表示挂载的内容可以在多个容器之间共享。Docker 会将挂载内容标记为共享标签,允许所有容器对其进行读写操作。
Z 选项:表示挂载的内容是私有的,且仅供单个容器使用。Docker 会将挂载内容标记为非共享标签,确保其他容器无法访问。
podman machine stop && podman machine set --rootful && podman machine start
podman run --name mysql-container --user 1000:1000 -e MYSQL_ROOT_PASSWORD=my_sql_pwd -d -p 3306:3306 -v /tmp/mysql_data:/var/lib/mysql mysql:latest
docker-compose.yml中设置用户为1000 user: '1000:1000'
services:
mysql:
image: mysql:8.0.32
container_name: mysql8
restart: unless-stopped
user: '1000:1000'
environment:
- MYSQL_ROOT_PASSWORD=1234ksdk
- TZ=Asia/Shanghai
networks:
- default
ports:
- '3306:3306'
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf/my.cnf:/etc/my.cnf

被折叠的 条评论
为什么被折叠?



