Criando um contêiner mysql do docker com um esquema de banco de dados preparado

8

Eu quero criar uma imagem do docker na parte superior do mysql que já contém o esquema necessário para o meu aplicativo.

Eu tentei adicionar linhas ao Dockerfile que importarão meu esquema como um arquivo sql. Eu fiz assim (meu Dockerfile):

FROM mysql

ENV MYSQL_ROOT_PASSWORD="bagabu"
ENV MYSQL_DATABASE="imhere"

ADD imhere.sql /tmp/imhere.sql

RUN "mysql -u root --password="bagabu" imhere < /tmp/imhere.sql"

No meu entender, isso não funcionou porque a imagem do docker do mysql não contém um cliente mysql (o estado das melhores práticas "não adiciona coisas apenas porque elas serão boas para ter") (estou errado sobre isso? )

qual pode ser uma boa maneira de fazer isso? Eu tive algumas coisas em mente, mas todas elas parecem ser uma confusão.

  1. instale o cliente mysql, faça o que eu tenho que fazer com ele, então remova / limpe-o.
  2. copie o binário do cliente mysql para a imagem, faça o que eu tenho que fazer, então remova-o.
  3. Crie o esquema em outro servidor sql e copie o arquivo db diretamente (isso parece muito confuso e soa como um conjunto contaminado de problemas)

Alguma sugestão? Espero que de uma forma que seja fácil de manter mais tarde e talvez esteja em conformidade com as melhores práticas também?

    
por Tom Klino 14.08.2016 / 20:12

3 respostas

11

Você deve colocar seu script de inicialização em um diretório montado como /docker-entrypoint-initdb.d - consulte a seção "Inicializando uma nova instância" no MySQL Docker docs de imagem .

    
por 15.08.2016 / 00:23
3

Eu tive que fazer isso para testes.

Veja como eu trabalhei aproveitando as imagens reais do MySQL / MariaDB no dockerhub e na compilação em vários estágios:

FROM mariadb:latest as builder

# That file does the DB initialization but also runs mysql daemon, by removing the last line it will only init
RUN ["sed", "-i", "s/exec \"$@\"/echo \"not running $@\"/", "/usr/local/bin/docker-entrypoint.sh"]

# needed for intialization
ENV MYSQL_ROOT_PASSWORD=root

COPY setup.sql /docker-entrypoint-initdb.d/

# Need to change the datadir to something else that /var/lib/mysql because the parent docker file defines it as a volume.
# https://docs.docker.com/engine/reference/builder/#volume :
#       Changing the volume from within the Dockerfile: If any build steps change the data within the volume after
#       it has been declared, those changes will be discarded.
RUN ["/usr/local/bin/docker-entrypoint.sh", "mysqld", "--datadir", "/initialized-db", "--aria-log-dir-path", "/initialized-db"]

FROM mariadb:latest

COPY --from=builder /initialized-db /var/lib/mysql

Exemplo completo de trabalho aqui: link

    
por 08.06.2018 / 23:34
-1

O software de gerenciamento como o Ansible pode ajudá-lo a automatizar uma importação do mysql sem a necessidade de instalar e reinstalar um cliente. O Ansible tem ótimos recursos internos para gerenciar imagens e containers do docker e bancos de dados mysql.

    
por 14.08.2016 / 22:34

Tags