Estoy usando Docker para crear un dockerfile con mysql como imagen base:
FROM mysql #set root pass ENV MYSQL_ROOT_PASSWORD password #update linux RUN apt-get update #create database RUN mysql -u root -ppassword -e "CREATE DATABASE dbname" #install vim RUN apt-get install vim -yEl dockerfile falla en el paso en el que intento crear una base de datos, no termina de construirse y recibo este error:
ERROR 2002 (HY000): No se puede conectar al servidor MySQL local a través del socket '/var/run/mysqld/mysqld.sock'
Cuando elimino el comando de ejecución de la base de datos #create, el dockerfile se compilará y puedo ejecutar un contenedor desde esa imagen. Sé que no es un problema con el servidor mysql, ya que puedo ingresar al contenedor y ejecutar el comando mysql manualmente con éxito y el estado del servicio se está ejecutando.
El uso de una variable de entorno, es decir, MYSQL_ROOT_PASSWORD dentro del archivo, también me permite crear una base de datos con éxito, pero esto solo funcionará con una única base de datos. Necesito poder usar el comando mysql para realizar consultas, como crear bases de datos adicionales, asignar usuarios, etc. .
Esto puede deberse a que necesito especificar el host y el puerto del contenedor acoplable, pero aún no me permite conectarme.
RUN mysql -u root -ppassword -h 127.0.0.1 -P 3308 -e "CREATE DATABASE dbname"Extrañamente, hacer esto también bloquea el contenedor y lo pone en un estado en el que se bloqueará nuevamente al iniciarse cada vez que intente reiniciarlo nuevamente.
Creo que el problema podría ser que el servicio no se inició dentro del contenedor utilizado para compilar su Dockerfile.
Use los comandos dados a continuación en su Dockerfile:
RUN service mysql restart && echo 'CREATE DATABASE db_name;' | mysql -uroot - pYOUR_ROOT_PASSWORDTenía el mismo problema: al iniciar el contenedor y ejecutar un conjunto de instrucciones RUN , o secuencias de comandos .sh o .sql en /docker-entrypoint-initdb.d/ , no se pudo establecer conexión con el servidor de la base de datos.
Encontré la solución por un comentario de @wpalmer en la imagen mysql:
Los scripts de inicio ejecutados por el punto de entrada, internamente, usan la variable "${mysql[@]}" para llamar a mysql (por ejemplo, al cargar archivos .sql ubicados en el directorio docker-entrypoint-initdb.d. Cualquier archivo .sh que son procesados por el punto de entrada se incluyen al "aprovisionarlos", lo que significa que la variable está disponible para su uso por cualquier archivo .sh que se ejecute).
Entonces, ¿qué significa esto para usted, en lugar de proporcionar el comando mysql simple con el usuario, pase, etc. como en
RUN mysql -u root -ppassword -e "CREATE DATABASE dbname"use el marcador de posición en su lugar:
RUN "${mysql[@]}" -e "CREATE DATABASE dbname"