Creando una imagen mysql con la base de datos precargada

Creando una imagen mysql con la base de datos precargada

Con la imagen de Docker de mysql, puede colocar scripts de mysqldump en una carpeta específica y utilizará esos scripts para cargar datos vacíos en el primer inicio.

Lo que me preguntaba es cómo crear una imagen donde esa ejecución ya haya tenido lugar como parte de la compilación para no tener que esperar la carga de datos inicial.

El propósito de la imagen es tener una copia para desarrolladores de una base de datos para pruebas locales.

Si es posible, me gustaría que se hiciera como una compilación de Docker de varias etapas para poder compilarla sin tener MySQL instalado en el servidor de compilación.

Mi proceso de pensamiento general, aunque aún no lo he probado, es el siguiente:

FROM mysql as builder
COPY *.sql /somefolder
COPY buildscript.sh /buildscript.sh

FROM mysql
COPY --from build /var/lib/mysql /data # to avoid using the volume folder

Y buildscript.shhace algo como

  1. iniciar mysqld
  2. espere a que mysqld se inicie por completo (??)
  3. ejecutar los SQL utilizados para construir los datos
  4. cerrar mysqld
  5. sincronización (asegúrese de que todos los archivos estén escritos)

Respuesta1

Creo que es posible hacerlo en Dockerfile en lugar de realizar la operación en el punto de entrada. Debe copiar los datos de la base de datos en una imagen y configurar my.cnf para que apunte al directorio donde almacenó esos datos y omita la operación de volcado al punto de entrada. De todos modos, como consideración personal, ¿qué ventaja obtienes de esto? Quiero decir, sí, no tiene que esperar para crear y completar la base de datos en el tiempo de ejecución, pero le costará tiempo cada vez que vuelva a crear la imagen y también agrandará la imagen porque se incluyen algunos datos en ella. Debe considerar si planea reconstruir mucho esa imagen, no cambiará mucho en términos de tiempo y costo; si no planea reconstruir la imagen con frecuencia, podría ser una ventaja.

Respuesta2

Aquí está mi solución de trabajo actual.

empiezo con elDockerfile

FROM mysql:5.7.23 as prep
COPY *.sql /docker-entrypoint-initdb.d/
COPY scripts/build-db.sh /
ARG MYSQL_ROOT_PASSWORD=my-very-secret
ARG MYSQL_USER=sampleuser
ARG MYSQL_PASSWORD=password123
RUN chmod u+x /build-db.sh
RUN /build-db.sh

FROM mysql:5.7.23
# use /data in my case so that it uses a directory that is not a VOLUME
COPY --from=prep /data /data

Luego agrego un build-db.shconjunto que toma el existente.punto de entrada.shy saque la última execlínea para que se detenga una vez que finalice la inicialización. Los datos se ingresan /dataporque el valor predeterminado /var/lib/mysqlno contendrá ningún dato en la siguiente etapa de la compilación.

#!/bin/bash
head -n -1 /usr/local/bin/docker-entrypoint.sh > /d2.sh
chmod +x /d2.sh
exec /d2.sh --datadir=/data

Para iniciarlo, debe --datadir=/datautilizar el directorio que no es de volumen.

información relacionada