Estoy tratando de crear un contenedor con una base de datos MySQL y agregar un esquema a estas bases de datos.
Mi Dockerfile actual es:
FROM mysql
MAINTAINER (me) <email>
# Copy the database schema to the /data directory
COPY files/epcis_schema.sql /data/epcis_schema.sql
# Change the working directory
WORKDIR data
CMD mysql -u $MYSQL_USER -p $MYSQL_PASSWORD $MYSQL_DATABASE < epcis_schema.sql
Para crear el contenedor, sigo la documentación proporcionada en Docker y ejecuto este comando:
docker run --name ${CONTAINER_NAME} -e MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD} -e MYSQL_USER=${DB_USER} -e MYSQL_PASSWORD=${DB_USER_PASSWORD} -e MYSQL_DATABASE=${DB_NAME} -d mvpgomes/epcisdb
Pero cuando ejecuto este comando, el Contenedor no se crea y en el estado del Contenedor es posible ver que el CMD no se ejecutó con éxito, de hecho solo mysql
se ejecuta el comando.
De todos modos, ¿hay alguna manera de inicializar la base de datos con el esquema o necesito realizar estas operaciones manualmente?
mysql
docker
database-schema
Marcus Gomes
fuente
fuente
Respuestas:
Lamento esta respuesta súper larga, pero tienes un pequeño camino por recorrer para llegar a donde quieres. Diré que normalmente no colocaría el almacenamiento para la base de datos en el mismo contenedor que la base de datos en sí, montaría un volumen de host para que los datos persistieran en el host del acoplador o, quizás, se podría utilizar un contenedor para mantener los datos (/ var / lib / mysql). Además, soy nuevo en mysql, por lo tanto, esto podría no ser súper eficiente. Dicho eso ...
Creo que puede haber algunos problemas aquí. El Dockerfile se usa para crear una imagen. Necesita ejecutar el paso de compilación. Como mínimo, desde el directorio que contiene el Dockerfile debería hacer algo como:
El Dockerfile describe la imagen a crear. No sé mucho acerca de mysql (soy un fanático de postgres), pero hice una búsqueda en los interwebs para "cómo inicializo un contenedor de docker mysql". Primero creé un nuevo directorio para trabajar, lo llamé mdir, luego creé un directorio de archivos en el que deposité un archivo epcis_schema.sql que crea una base de datos y una sola tabla:
Luego creé un script llamado init_db en el directorio de archivos:
(la mayor parte de este script se levantó de aquí: https://gist.github.com/pda/9697520 )
Aquí está el script files / run_db que creé:
Finalmente, el Dockerfile para unirlos a todos:
Entonces, ingresé a mi directorio mdir (que tiene el Dockerfile junto con el directorio de archivos). Luego ejecuto el comando:
Debería ver una salida como esta:
Ahora tiene una imagen '7f6d5215fe8d'. Podría ejecutar esta imagen:
y la imagen comienza, veo una cadena de instancia:
Entonces podría 'detenerlo' y reiniciarlo.
Si observa los registros, la primera línea contendrá:
Luego, al final de los registros:
Estos son los mensajes del script / tmp / run_db, el primero indica que la base de datos se desempaquetó de la versión guardada (inicial), el segundo indica que la base de datos ya estaba allí, por lo que se utilizó la copia existente.
Aquí hay un ls -lR de la estructura de directorios que describo anteriormente. Tenga en cuenta que init_db y run_db son scripts con el conjunto de bits de ejecución:
fuente
init_db
script.RUN
comando y el problema aparentemente está resuelto. Pero luego, cuando ejecutodocker run
, tengo el mismo problema con elrun_db
script.Tuve el mismo problema en el que quería inicializar el esquema de mi instancia de MySQL Docker, pero tuve dificultades para hacer que esto funcionara después de buscar en Google y seguir los ejemplos de otros. Así es como lo resolví.
1) Volcar su esquema MySQL a un archivo.
2) Use el comando AGREGAR para agregar su archivo de esquema al
/docker-entrypoint-initdb.d
directorio en el contenedor Docker. Eldocker-entrypoint.sh
archivo ejecutará cualquier archivo en este directorio que termine en".sql"
la base de datos MySQL.Dockerfile:
3) Inicie la instancia de Docker MySQL.
¡Gracias a Configurar MySQL e importar el volcado dentro de Dockerfile por darme pistas sobre docker-entrypoint.sh y el hecho de que ejecuta scripts SQL y shell!
fuente
schema.sql
? Quiero que mi base de datos se actualice en consecuencia. Además, ¿qué sucede cuando construyo este contenedor por segunda vez? ¿DB será destruido y creado de nuevo?Otra forma basada en una combinación de varias respuestas aquí antes:
docker-compose file:
dónde
/home/user
... es una carpeta compartida en el hostY en la
/home/user/db/mysql/init
carpeta ... simplemente suelte un archivo sql, con cualquier nombre, por ejemplo queinit.sql
contenga:De acuerdo con la documentación oficial de mysql , puede colocar más de un archivo sql en
docker-entrypoint-initdb.d
, se ejecutan en orden alfabéticofuente
La otra forma simple, usa docker-compose con las siguientes líneas:
Coloque el esquema de su base de datos en ./database/install_db.sql. Cada vez que construya su contenedor, se ejecutará install_db.sql.
fuente
He intentado la respuesta de Greg con cero éxito, debo haber hecho algo mal ya que mi base de datos no tenía datos después de todos los pasos: estaba usando la última imagen de MariaDB, por si acaso.
Luego decidí leer el punto de entrada para la imagen oficial de MariaDB , y lo usé para generar un archivo simple de docker-compose :
¡Ahora puedo conservar mis datos Y generar una base de datos con mi propio esquema!
fuente
Después del 4 de agosto de 2015, si está utilizando la imagen oficial de MySQL Docker, puede AGREGAR / COPIAR un archivo en el directorio /docker-entrypoint-initdb.d/ y se ejecutará con el contenedor inicializado. Consulte github: https://github.com/docker-library/mysql/commit/14f165596ea8808dfeb2131f092aabe61c967225 si desea implementarlo en otras imágenes de contenedor
fuente
La solución más fácil es usar tutum / mysql
Paso 1
Paso 2
Paso 3
Supera el CONTAINER_ID y luego ejecuta el comando
docker logs
para ver la información de contraseña generada.fuente
tutum/mysql:5.5
y tuvo éxito.docker run -d -p 3306:3306 -v /tmp:/tmp -e MYSQL_PASS="admin" -e STARTUP_SQL="/tmp/mysqldump.mysql" tutum/mysql:5.5
. Siempre puede ejecutar el comandodocker logs CONTAINER_ID
para ver los mensajes de error si tiene problemas./tmp/to_be_imported.mysql
viene el camino . ¿Es esa una ruta en el sistema operativo host? ¿Dónde está unCOPY
oADD
para poner cosas en el sistema de archivos del contenedor?COPY
/ADD
porque el directorio de host / tmp está montado en / tmp del contenedor. Mire de cerca el comando allí está la parte-v /tmp:/tmp
. Personalmente, no montaría un volumen simplemente para poner el archivo a disposición del contenedor, pero supongo que es una elección personal.Para aquellos que no desean crear un script de punto de entrada como yo, en realidad pueden iniciar mysqld en el tiempo de compilación y luego ejecutar los comandos mysql en su Dockerfile de la siguiente manera:
La clave aquí es enviar mysqld_safe a segundo plano con el
&
signo único .fuente
A continuación se muestra el Dockerfile que utilicé con éxito para instalar xampp, crear un MariaDB con esquema y rellenado previamente con la información utilizada en el servidor local (usrs, pedidos de fotos, etc.)
fuente
Luego de luchar un poco con eso, eche un vistazo al Dockerfile usando volúmenes con nombre (db-data). Es importante declarar un plus en la parte final, donde mencioné que el volumen es
[external]
¡Todo funcionó muy bien de esta manera!
fuente