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
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐