Criando uma imagem mysql com o banco de dados pré-carregado

Criando uma imagem mysql com o banco de dados pré-carregado

Com a imagem Docker do mysql você pode colocar scripts mysqldump em uma pasta específica e ele usará esses scripts para carregar dados vazios na primeira inicialização.

O que eu queria saber é como criar uma imagem onde essa execução já tenha ocorrido como parte da construção, para que não tenhamos que esperar pelo carregamento inicial dos dados.

O objetivo da imagem é ter uma cópia do desenvolvedor de um banco de dados para testes locais.

Se possível, gostaria que fosse feito como uma construção do Docker de vários estágios para que eu possa construí-la sem ter o MySQL instalado no servidor de compilação.

Meu processo de pensamento geral, embora ainda não tenha experimentado, é o seguinte:

FROM mysql as builder
COPY *.sql /somefolder
COPY buildscript.sh /buildscript.sh

FROM mysql
COPY --from build /var/lib/mysql /data # to avoid using the volume folder

E buildscript.shfaz algo como

  1. inicie o mysqld
  2. espere o mysqld iniciar totalmente (??)
  3. execute os SQLs usados ​​para construir os dados
  4. desligue o mysqld
  5. sincronizar (certifique-se de que todos os arquivos foram gravados)

Responder1

Acho que é possível fazer isso no Dockerfile, em vez de executar a operação no ponto de entrada. Você deve copiar os dados do banco de dados para a imagem e configurar o my.cnf para apontar o diretório onde você armazenou esses dados e pular a operação de dump para o ponto de entrada. De qualquer forma, como consideração pessoal, qual vantagem você obtém com isso? Quero dizer, sim, você não precisa esperar para criar e preencher o banco de dados em tempo de execução, mas isso custará tempo toda vez que você construir novamente a imagem, e também aumentará a imagem porque alguns dados estão incluídos nela. Você deve considerar que se planeja reconstruir muito essa imagem, isso não mudará muito no custo de tempo; se você não planejar reconstruir a imagem com frequência, poderá ser uma vantagem.

Responder2

Aqui está minha solução de trabalho atual.

Eu começo com oDockerfile

FROM mysql:5.7.23 as prep
COPY *.sql /docker-entrypoint-initdb.d/
COPY scripts/build-db.sh /
ARG MYSQL_ROOT_PASSWORD=my-very-secret
ARG MYSQL_USER=sampleuser
ARG MYSQL_PASSWORD=password123
RUN chmod u+x /build-db.sh
RUN /build-db.sh

FROM mysql:5.7.23
# use /data in my case so that it uses a directory that is not a VOLUME
COPY --from=prep /data /data

Então eu adiciono um build-db.shwhich sets que leva o existenteponto de entrada.she retire a última execlinha para fazê-lo parar assim que terminar a inicialização. Os dados são inseridos /dataporque o padrão /var/lib/mysqlnão conterá nenhum dado no próximo estágio da construção.

#!/bin/bash
head -n -1 /usr/local/bin/docker-entrypoint.sh > /d2.sh
chmod +x /d2.sh
exec /d2.sh --datadir=/data

Para iniciá-lo, você precisa --datadir=/datausar o diretório sem volume.

informação relacionada