Saltar al contenido

Los scripts de MySQL en docker-entrypoint-initdb no se ejecutan

Ariana, parte de este gran equipo, nos hizo el favor de redactar esta reseña porque controla a la perfección el tema.

Solución:

deberías despejar data_volume antes de ejecutar el contenedor y se ejecutarán los archivos sql. este volumen data_volume se puede eliminar usando el comando: docker volume rm data_volume.

La causa raíz de su problema se puede encontrar en docker-entrypoint.sh. Cuando ejecuta un contenedor mysql, verifica el directorio mysql /var/lib/mysql existir o no. Si el directorio no existe (ejecútelo por primera vez), ejecutará sus archivos SQL.

    if [ ! -d "$DATADIR/mysql" ]; then
        //Some other logic here

        for f in /docker-entrypoint-initdb.d/*; do
            case "$f" in
                *.sh)     echo "$0: running $f"; . "$f" ;;
                *.sql)    echo "$0: running $f"; "$mysql[@]" < "$f"; echo ;;
                *.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "$mysql[@]"; echo ;;
                *)        echo "$0: ignoring $f" ;;
            esac
            echo
        done 

Puede obtener más detalles en la fuente de Dockerfile

Así que tuve el mismo problema durante horas y luego decidí buscar en docker-entrypoint.sh. Resulta que el script busca $DATADIR/mysql, típicamente /var/lib/mysql y omite el resto del código si existe datadir, incl. ventana acoplable-punto de entrada-initdb.d

Entonces, lo que hice fue crear un archivo init.sh simple para eliminar el directorio de datos y luego iniciar la ventana acoplable.

docker-compose.yml:

volumes:
  - ./docker/mysql/scripts:/docker-entrypoint-initdb.d
  - ./mysql_data:/var/lib/mysql

init.sh:

#!/bin/bash
rm -rf mysql_data
docker-compose up --force-recreate

y por supuesto agregar -d a docker-compose una vez que veo que funciona como se esperaba.

Tuve exactamente el mismo problema con la imagen de mariadb (versión: 10.4) y lo resolví asegurándome de que el volumen de datos de mi contenedor esté vacío de cualquier archivo o directorio cuando creo el contenedor desde cero.

Este es mi archivo de composición docker:

  mariadb:
    image: mariadb:10.4
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ********
    volumes:
    - ./storage/db:/var/lib/mysql:rw
    - ./app/db/SQL:/docker-entrypoint-initdb.d/:rw
    ports:
    - 3306:3306/tcp

Para mí, solo tenía que asegurarme de que esta ruta: './storage/db' esté vacía de archivos. Tenga en cuenta que el directorio debe existir pero estar vacío.

Aquí tienes las comentarios y valoraciones

Si haces scroll puedes encontrar las reseñas de otros sys admins, tú asimismo tienes la opción de insertar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *