Estoy ejecutando Docker en Ubuntu e intento crear y ejecutar un contenedor MySql. Quiero usar un recurso compartido de red montado para el directorio de datos. Estoy probando el siguiente comando de ejecución de la ventana acoplable, pero tengo problemas con los permisos. ¿Cómo puedo solucionar esto?
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/ servidor mysql
[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.Esto no es exactamente con MySQL, pero espero que les pueda dar una idea, básicamente uso esto para probar contra una base de datos MySQL desde mi entorno local, para esto uso docker-compose y MariaDB , configuro el "data-dir" como un volumen para que pueda detener/iniciar el contenedor acoplable sin la necesidad de "sembrar" cada vez que la base de datos.
Este es el contenido del archivo /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 En el mismo directorio, tengo el directorio de volumen /your/path/mariadb/db
Luego, para abrir el contenedor que uso:
$ docker-compose up Desde docker-compose.yml puede ver que uso el puerto 13306 , por lo tanto, para probar/conectar, uso:
$ mysql -h 127.0.0.1 -P13306 -uroot -p Todos los datos (bases de datos) estarán en /your/path/mariadb/db
Si te encuentras con el mismo problema de "permisos":
mysqld: Cannot change permissions of the file 'ca.pem' (OS errno 1 - Operation not permitted)Intente cambiar los permisos de su volumen/punto de montaje, por ejemplo:
chmod -R 777 /your/volume/mount_pointSi usa CIF para el montaje en red, significa que el servidor remoto es Windows, ¿verdad? Mi respuesta se basa en esta suposición.
La última imagen de mysql docker tiene un usuario llamado mysql y su uid=27,gid=27 Verifique esto montando una carpeta vacía como data_dir. Verá que los archivos creados por el contenedor mysql tienen usuario y grupo como 27. Por lo tanto, el contenedor mysql espera archivos con uid/gid (ID de usuario propietario e ID de grupo propietario) como 27 en su data_dir. Pero los archivos que montó desde el recurso compartido de Windows tienen uid/gid que pertenece al usuario que ejecuta el comando de montaje en ubuntu. Este es el comportamiento predeterminado del comando de montaje.
Para resolver esto, debe pasar los parámetros "uid=27,gid=27" al comando de montaje de Linux.
Por ejemplo
sudo mount -t cifs -o nombreusuario=nombre-usuario-windows,uid=27,gid=27 //WIN_SHARE_IP/ /mnt/wayne
Puedes mirar aquí para más detalles
Debo decir que es poco probable que ejecute mysql en un recurso compartido de red. No funcionará bien.
bien, probé esto y google también, lo que encontré es
https://github.com/docker-library/mysql/issues/302#issuecomment-308745834
Entonces, básicamente, si está usando mysql:5.7 , actualice a mysql:5.7.16 .
Y si esto no ayuda, entonces tengo una solución más.
Básicamente, el problema es que está compartiendo el directorio con el contenedor -v /mnt/wayne/mysql:/var/lib/mysql/ pero ubuntu no está dando permiso para acceder al directorio /mnt/wayne/mysql . así que otorgue permiso de administrador a esta ubicación o puede crear un chown y chmode de usuario docker.
Básicamente, dé permiso al directorio de la máquina host. para que el contenedor docker pueda acceder a él.
y una cosa más también da permiso al directorio del contenedor docker, que se muestra en su error
The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it.
Cree un usuario en un contenedor docker que tenga permisos chown y chmod para el directorio /var/lib/mysql/ .
si está utilizando dockerfile para crear un contenedor mysql, use estas 2 líneas siguientes en él
FROM mysql:5.7.16 WORKDIR /app RUN chown -R admin:admin /app RUN chmod 755 /app USER admin CMD ["Your command"]