hubs - mysql 8.0 docker
Uso de docker-compose para crear un esquema/base de datos MySQL (5)
Estoy tratando de crear una base de datos / esquema mysql si aún no existe.
Esto es lo que he intentado:
docker-compose.yml
mysql:
image: mysql:5.6.26
environment:
- MYSQL_ROOT_PASSWORD=root
command: "mysql -uroot -proot < createDB.sql"
ports:
- "3306:3306"
createDB.sql
CREATE DATABASE IF NOT EXISTS bignibou;
No funciona. ¿Cuál sería la mejor manera de usar docker / docker-compose para crear un esquema si no existe?
Desde la documentación de la ventana acoplable, consulte la sección Definir servicios , puede saber qué Dockerfile utilizará para generar la imagen. Por lo tanto, puede crear un Dockerfile basado en la imagen mysql y crear la base de datos en su interior utilizando los comandos estándar de Dockerfile.
Esto podría ser útil en caso de que alguien aterrice aquí en el futuro. El problema real parece ser la declaración de "comando" en el archivo de composición acoplable. Una vez que el comando termine con éxito, el contenedor se destruirá. Este script sql debe ejecutarse solo después de que se haya ejecutado docker-compose y se hayan creado contenedores. docker-compose "command" es realmente iniciar un servicio en el contenedor. En este caso, usted anuló el servicio mysql con su comando.
Finalmente encontré el comienzo de una solución.
La imagen de MySQL toma una variable de entorno, es decir, MYSQL_DATABASE, que inicializa el contenedor con el nombre de la base de datos en el inicio de la imagen. Consulte aquí para obtener la documentation completa.
O lea el extracto a continuación:
MYSQL_DATABASE
Esta variable es opcional y le permite especificar el nombre de una base de datos que se creará en el inicio de la imagen. Si se proporcionó un usuario / contraseña (ver más abajo), a ese usuario se le otorgará acceso de superusuario (correspondiente a GRANT ALL) a esta base de datos.
Aquí está lo que se me ocurrió:
mysql:
image: mysql:5.6.26
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=bignibou
ports:
- "3306:3306"
Ahora necesito una forma de especificar la intercalación predeterminada, pero esa es otra historia ...
editar : para aquellos interesados en especificar una intercalación diferente de la predeterminada, aquí están las instrucciones para usar otro archivo de configuración que anulará el predeterminado. Vea abajo:
Uso de un archivo de configuración MySQL personalizado La configuración de inicio de MySQL se especifica en el archivo /etc/mysql/my.cnf, y ese archivo a su vez incluye todos los archivos encontrados en el directorio /etc/mysql/conf.d que terminan con .cnf. Las configuraciones en los archivos en este directorio aumentarán y / o anularán las configuraciones en /etc/mysql/my.cnf. Si desea usar una configuración MySQL personalizada, puede crear su archivo de configuración alternativa en un directorio en la máquina host y luego montar esa ubicación de directorio como /etc/mysql/conf.d dentro del contenedor mysql.
Si /my/custom/config-file.cnf es la ruta y el nombre de su archivo de configuración personalizado, puede iniciar su contenedor mysql así (tenga en cuenta que en este comando solo se usa la ruta del directorio del archivo de configuración personalizado):
$ docker run - nombre some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD = my-secret-pw -d mysql: tag Esto iniciará un nuevo contenedor en mysql donde el MySQL la instancia utiliza la configuración de inicio combinada de /etc/mysql/my.cnf y /etc/mysql/conf.d/config-file.cnf, con la configuración de este último teniendo prioridad.
Para no perder sus datos, también use volúmenes:
version: ''3''
services:
db:
image: mysql:5.7
volumes:
- mysql-db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: my_db_name
ports:
- "3307:3306"
volumes:
mysql-db:
Probablemente lo que estás tratando de hacer necesita un script adicional. Por lo tanto, si construir una imagen en lugar de usar directamente una imagen precompilada es una opción para usted, debe usar un archivo Docker y usar un archivo de script que primero importe el script en MySql y luego ejecute el servicio.
Eche un vistazo a esta respuesta: Docker - Inicialice la base de datos mysql con un esquema