Error de SQL en Docker

Error de SQL en Docker

Mi objetivo es ejecutar algunos comandos en mi Dockerfile que crearán un usuario de SQL y le otorgarán algunos privilegios. Entonces hago lo siguiente:

FROM ubuntu:18.04
...
RUN apt-get install -y apache2
RUN apt-get install -y mysql-server
RUN mysql -Bse "CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'testpass';"
RUN mysql -Bse "GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'localhost';"

Esto falla en el primer comando mysql

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

Sin embargo, si a través de StackExchange descubro que si elimino los comandos SQL de Dockerfile e inicio sesión con Docker Exec en un contenedor en ejecución, la siguiente solución funcionará:

service apache2 stop
service mysql stop
service mysql start
service apache2 start
mysql -Bse "CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'testpass';"
mysql -Bse "GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'localhost';"

Como quiero que todos los comandos estén en Dockerfile, probé la service stop/startsolución anterior, pero no funcionará desde Dockerfile, solo después de ejecutar en un contenedor que ya se está ejecutando. Supongo que se requiere una solución diferente.

¿Cómo puedo automatizar la ejecución de estos comandos SQL sin tener que ejecutarlos manualmente con Docker Exec? Gracias

PD: avíseme si la pregunta sería más adecuada para otro sitio de Stack Exchange.

Respuesta1

El problema está relacionado con el hecho de que cada comando RUN se ejecuta en una capa diferente. La solución fue agregar todos los comandos relacionados en un archivo init_db.sh de script bash y ejecutarlo en Dockerfile.

#!/bin/bash

service apache2 stop
service mysql stop
service mysql start
service apache2 start

mysql -Bse "CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'testpass';"
mysql -Bse "GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'localhost';"
ADD init_db.sh /tmp/init_db.sh
RUN /tmp/init_db.sh

fuente:https://stackoverflow.com/questions/25920029/setting-up-mysql-and-importing-dump-within-dockerfile

información relacionada