Estou tentando criar um contêiner com um banco de dados MySQL e adicionar um esquema a esses bancos de dados.
Meu Dockerfile atual é:
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 criar o contêiner, estou seguindo a documentação fornecida no Docker e executando 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
Porém, quando executo esse comando, o Container não é criado e, no status do Container, é possível ver que o CMD não foi executado com êxito; na verdade, apenas o mysql
comando é executado.
De qualquer forma, existe uma maneira de inicializar o banco de dados com o esquema ou preciso executar essas operações manualmente?
mysql
docker
database-schema
Marcus Gomes
fonte
fonte
Respostas:
Sinto muito por esta resposta super longa, mas você tem um pequeno caminho a percorrer para chegar onde deseja. Eu direi que normalmente você não colocaria o armazenamento para o banco de dados no mesmo contêiner que o próprio banco de dados, montaria um volume do host para que os dados persistissem no host do docker ou talvez um contêiner pudesse ser usado para mantenha os dados (/ var / lib / mysql). Além disso, eu sou novo no mysql, portanto, isso pode não ser super eficiente. Dito isto...
Eu acho que pode haver alguns problemas aqui. O Dockerfile é usado para criar uma imagem. Você precisa executar a etapa de construção. No mínimo, no diretório que contém o Dockerfile, você faria algo como:
O Dockerfile descreve a imagem a ser criada. Eu não sei muito sobre mysql (eu sou um fanboy do postgres), mas fiz uma pesquisa nas interwebs por 'como faço para inicializar um contêiner do mysql docker'. Primeiro, criei um novo diretório para trabalhar, chamei-o de mdir e, em seguida, criei um diretório de arquivos em que depositei um arquivo epcis_schema.sql que cria um banco de dados e uma única tabela:
Então eu criei um script chamado init_db no diretório files:
(a maior parte deste script foi retirada daqui: https://gist.github.com/pda/9697520 )
Aqui está o script files / run_db que criei:
Por fim, o Dockerfile para vincular todos eles:
Então, liguei para o meu diretório mdir (que possui o Dockerfile junto com o diretório de arquivos). Eu então executo o comando:
Você deve ver uma saída como esta:
Agora você tem uma imagem '7f6d5215fe8d'. Eu poderia executar esta imagem:
e a imagem começa, vejo uma string de instância:
Eu poderia então 'pará-lo' e reiniciá-lo.
Se você olhar para os logs, a primeira linha conterá:
Então, no final dos logs:
Essas são as mensagens do script / tmp / run_db, a primeira indica que o banco de dados foi descompactado da versão salva (inicial), a segunda indica que o banco de dados já estava lá e, portanto, a cópia existente foi usada.
Aqui está um ls -lR da estrutura de diretórios que descrevi acima. Observe que o init_db e o run_db são scripts com o bit de execução definido:
fonte
init_db
script.RUN
comando e o problema aparentemente está resolvido. Mas quando executodocker run
, tenho o mesmo problema com orun_db
script.Eu tive esse mesmo problema em que queria inicializar o esquema da minha instância do MySQL Docker, mas tive dificuldade em fazê-lo funcionar depois de pesquisar no Google e seguir os exemplos de outros. Aqui está como eu resolvi isso.
1) Despeje seu esquema MySQL em um arquivo.
2) Use o comando ADD para adicionar seu arquivo de esquema ao
/docker-entrypoint-initdb.d
diretório no contêiner do Docker. Odocker-entrypoint.sh
arquivo executará todos os arquivos deste diretório que terminem com".sql"
o banco de dados MySQL.Dockerfile:
3) Inicie a instância do Docker MySQL.
Obrigado por configurar o MySQL e importar o dump no Dockerfile por me informar sobre o docker-entrypoint.sh e pelo fato de ele executar scripts SQL e shell!
fonte
schema.sql
? Quero que meu db seja atualizado de acordo. Além disso, o que acontece quando eu construo esse contêiner pela segunda vez? O db será destruído e criado novamente?Outra maneira baseada em uma mescla de respostas servidoras aqui antes:
arquivo de encaixe-compor:
onde
/home/user
.. é uma pasta compartilhada no hostE na
/home/user/db/mysql/init
pasta .. basta soltar um arquivo sql, com qualquer nome, por exemplo,init.sql
contendo:De acordo com a documentação oficial do mysql , você pode colocar mais de um arquivo sql no
docker-entrypoint-initdb.d
, eles são executados em ordem alfabéticafonte
A outra maneira simples, use docker-compose com as seguintes linhas:
Coloque o esquema do banco de dados em ./database/install_db.sql. Toda vez que você criar seu contêiner, o install_db.sql será executado.
fonte
Eu tentei a resposta de Greg com zero sucesso, devo ter feito algo errado, já que meu banco de dados não tinha dados após todas as etapas: eu estava usando a imagem mais recente do MariaDB, por precaução.
Decidi ler o ponto de entrada da imagem oficial do MariaDB e usei isso para gerar um simples arquivo de composição de encaixe :
Agora eu consigo persistir meus dados E gerar um banco de dados com meu próprio esquema!
fonte
Depois de 4 de agosto de 2015, se você estiver usando a imagem oficial do mysql Docker, poderá simplesmente adicionar / copiar um arquivo no diretório /docker-entrypoint-initdb.d/ e ele será executado com o contêiner inicializado. Consulte o github: https://github.com/docker-library/mysql/commit/14f165596ea8808dfeb2131f092aabe61c967225 se você deseja implementá-lo em outras imagens de contêiner
fonte
A solução mais fácil é usar tutum / mysql
Passo 1
Passo 2
Etapa 3
Fique acima de CONTAINER_ID e execute o comando
docker logs
para ver as informações de senha geradas.fonte
tutum/mysql:5.5
e conseguiu.docker run -d -p 3306:3306 -v /tmp:/tmp -e MYSQL_PASS="admin" -e STARTUP_SQL="/tmp/mysqldump.mysql" tutum/mysql:5.5
. Você sempre pode executar o comandodocker logs CONTAINER_ID
para ver as mensagens de erro se tiver encontrado problemas./tmp/to_be_imported.mysql
vem o caminho . esse é um caminho no sistema operacional host? onde está umCOPY
ouADD
para colocar coisas no sistema de arquivos do contêiner?COPY
/ADD
porque o diretório de host / tmp está montado em / tmp do contêiner. Observe atentamente o comando que existe-v /tmp:/tmp
. Pessoalmente, eu não montaria um volume simplesmente para disponibilizar o arquivo para o contêiner, mas acho que é uma escolha pessoal.Para aqueles que não desejam criar um script de ponto de entrada como eu, você pode realmente iniciar o mysqld no momento da construção e, em seguida, executar os comandos mysql no seu Dockerfile da seguinte maneira:
A chave aqui é enviar mysqld_safe para segundo plano com o único
&
sinal.fonte
Abaixo está o Dockerfile que usei com êxito para instalar o xampp, criar um MariaDB com o esquema e preencher previamente as informações usadas no servidor local (usrs, pedidos de fotos, etc.)
fonte
Depois de lutar um pouco com isso, dê uma olhada no Dockerfile usando volumes nomeados (db-data). É importante declarar uma vantagem na parte final, onde mencionei que o volume é
[external]
Tudo funcionou muito bem dessa maneira!
fonte