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 .
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.
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?
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 .
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
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.