
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/start
solució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