MySql docker 容器在使用数据目录的网络共享时未启动



我在 Ubuntu 中运行 docker 并尝试创建和运行 MySql 容器。 我想对数据目录使用装载的网络共享。 我正在尝试以下 docker 运行命令,但我的权限有问题。 我该如何解决这个问题?

root@jarvis:/mnt/wayne/mysql-data$ sudo docker run -it -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin -v/mnt/wayne

/mysql:/var/lib/mysql/--name mysqlserver mysql/mysql-server
[Entrypoint] MySQL Docker Image 8.0.20-1.1.16
[Entrypoint] Initializing database
2020-06-08T21:43:25.253898Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.20) initializing of server in progress as process 22
2020-06-08T21:43:25.281460Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2020-06-08T21:43:27.815075Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
mysqld: Cannot change permissions of the file 'ca.pem' (OS errno 1 - Operation not permitted)
2020-06-08T21:43:29.851875Z 0 [ERROR] [MY-010295] [Server] Could not set file permission for ca.pem
2020-06-08T21:43:29.852970Z 0 [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it.
2020-06-08T21:43:29.854806Z 0 [ERROR] [MY-010119] [Server] Aborting
2020-06-08T21:43:31.947298Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.20)  MySQL Community Server - GPL.

好的,我试过这个,谷歌也,我发现的是

https://github.com/docker-library/mysql/issues/302#issuecomment-308745834

所以基本上如果你正在使用mysql:5.7然后升级到mysql:5.7.16.

如果这没有帮助,那么我还有一个解决方案。

基本上问题是您将目录共享到容器-v /mnt/wayne/mysql:/var/lib/mysql/但 ubuntu 没有授予访问/mnt/wayne/mysql目录的权限。 因此,请授予此位置的管理员权限,或者您可以创建一个 docker 用户chownchmode

基本上授予对主机目录的权限,以便 docker 容器可以访问它。

还有一件事也允许 docker 容器目录,这显示在您的错误中

The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it.

在 docker 容器中创建对目录/var/lib/mysql/具有chownchmod权限的用户。

如果您使用 Dockerfile 创建 MySQL 容器,请在其中使用以下 2 行

FROM mysql:5.7.16
WORKDIR /app
RUN chown -R admin:admin /app
RUN chmod 755 /app
USER admin
CMD ["Your command"] 

您使用 CIF 进行网络挂载意味着远程服务器是 Windows 对吗?我的回答是基于这个假设。

最新的 mysql docker 镜像有一个名为 mysql 的用户,其 uid=27,gid=27 您可以通过将空文件夹挂载为 data_dir 来验证这一点。您将看到mysql容器创建的文件具有用户和组为27。 因此,mysql 容器期望 uid/gid(所有者用户 id 和所有者组 id(的文件在其data_dir中为 27。但是您从 Windows 共享挂载的文件具有 uid/gid,它属于在 ubuntu 中执行挂载命令的用户。这是挂载命令的默认行为。

要解决此问题,您需要将"uid=27,gid=27"参数传递给 Linux mount 命令。

例如

须藤坐骑 -t CIFS -O 用户名=Windows-用户名,uid=27,gid=27 WIN_SHARE_IP//mnt/wayne

您可以在此处查看更多详细信息

我必须说它不太可能在网络共享上运行mysql。它不会表现得很好。

这并不完全是 MySQL,但我希望它能给你一个想法,我基本上用它来测试来自我的本地环境的 MySQL 数据库,为此我使用docker-composeMariaDB,我将"data-dir"配置为卷,以便我可以停止/启动 docker 容器,而无需每次数据库时都"播种"。

这是/your/path/docker-compose.yml文件的内容:

---
version: '3'
services:
mariadb:
image: mariadb:10.4.13
container_name: mariadb
restart: always
ports:
- 13306:3306
environment:
MYSQL_DATABASE: world
MYSQL_ROOT_PASSWORD: test
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
volumes:
- ${PWD}/mariadb/db/:/var/lib/mysql

在同一个目录中,我有卷目录/your/path/mariadb/db

然后调出我使用的容器:

$ docker-compose up

docker-compose.yml可以看到我使用端口13306因此用于测试/连接我使用:

$ mysql -h 127.0.0.1 -P13306 -uroot -p

所有数据(数据库(都将/your/path/mariadb/db

如果您遇到相同的"权限"问题:

mysqld: Cannot change permissions of the file 'ca.pem' (OS errno 1 - Operation not permitted)

尝试更改卷/装入点的权限,例如:

chmod -R 777 /your/volume/mount_point

为了正常运行,MariaDB或MySQL需要对自己的文件设置一些权限。某些外部文件系统(如 FTP 和许多其他文件系统(不支持这些功能。您需要使用支持这些功能的文件系统。

存在访问挂载卷的权限问题。请阅读有关使用卷的文档:

https://docs.docker.com/storage/volumes/#use-a-volume-driver

对于 NFSv3 分区:

$ 码头工人服务 create -d \ --名称 NFS-服务 \ --mount 'type=volume,source=nfsvolume,target=/app,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/var/docker-nfs,volume-opt=o=addr=10.0.0.10' \ nginx:最新

或者检查 CA.pem 文件权限(使用 chmod 777/path/to/ca.pem(

对于 NFSv4 分区:

码头工人服务创建 -d \ --名称 NFS-服务 \ --mount 'type=volume,source=nfsvolume,target=/app,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/var/docker-nfs,"volume-opt=o=10.0.0.10,rw,nfsvers=4,async"' \ nginx:最新

检查 https://docs.docker.com/storage/volumes/#use-a-volume-driver

最新更新