Criando uma imagem MySql com dados pré-carregados. (Docker)

Seguindo a linha de posts sobre Docker, resolvi fazer alguns posts com exemplos práticos. Este primeiro é a criação de uma imagem do MySQL que já vem pré-populada com dados personalizados. Os que vou utilizar são bem simples, mas você pode modificar a vontade.

01: Escolhendo uma imagem base

FROM mysql/mysql-server

A imagem base será, por razões obvias, a base do servidor MySql.

 

 

02: Definindo as variáveis de build/ambiente

Se estiver com dúvida entre ARG e ENV, veja este post.

 

ARG ROOT_PASSWORD=dev123
ENV MYSQL_ROOT_PASSWORD=${ROOT_PASSWORD}

A primeira é a senha do usuário root.

 

ARG SETUP_DATABASE=db_log
ENV MYSQL_DATABASE=${SETUP_DATABASE}

A segunda variável é o nome da base de dados que será criada no momento em que a imagem for criada. Como o script que criei é para uma base de dados de log, resolvi chamar esta base de db_log.

 

ARG SETUP_REMOTE_USERNAME=remote
ARG SETUP_REMOVE_PASSWORD=dev123

As próximas duas variáveis são referentes a um usuário remoto, pois você não conseguirá acessar o banco com root logo após instalar, pois ele não possui acesso remoto por padrão.

Como configurações podem mudar de lugar entre versões, para deixar esta imagem mais resiliente a mudanças, resolvi utilizar a abordagem de já criar a base de dados com um usuário remoto.

Só para reforçar, ao tentar se conectar com um banco de dados que está em um container, você não está utilizando o localhost, está conectando localhost <-> localhost. Você consegue acessar usando o servidor localhost:3306, pois o Docker redireciona os dados desta porta para o IP do container.

 

 

03: Copiando os dados que serão carregados

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

O arquivo setup.sql, que possui todos os comandos para criar e popular as tabelas, deve estar no mesmo diretório do arquivo DockerFile. Ele será copiado para o diretório docker-entrypoint-initdb.d. A imagem base do MySql foi implementada de forma que ela irá executar todos os scripts (.sql, .sql.gz e .sh) colocados nesta pasta. Caso queira colocar mais de um arquivo nesta pasta, lembre-se que a execução deles ocorre em ordem alfabética. Para mais informações, consulte a documentação da imagem do MySql para Docker.

 

 

04: Criando usuário remoto

RUN echo "CREATE USER '${SETUP_REMOTE_USERNAME}'@'%' IDENTIFIED BY '${SETUP_REMOVE_PASSWORD}';GRANT ALL PRIVILEGES ON *.* TO '${SETUP_REMOTE_USERNAME}'@'%' WITH GRANT OPTION;" > /docker-entrypoint-initdb.d/_grant_remote.sql

A ideia deste passo é criar um script com os comandos necessários para criar um usuário com permissão remota e colocar este arquivo na pasta que mencionei no passo anterior.

 

 

05:  Comandos finais

EXPOSE 3306

CMD ["mysqld"]

Os últimos dois comandos do arquivo DockerFile são para expor a porta do MySql e o outro é para iniciá-lo.

 

 

06: Gerando a imagem

docker build -t preLoadedMySql:latest .

O comando para gerar a imagem é bem simples e já passamos por ele em vários dos últimos posts. Neste exemplo, chamei a imagem de preLoadedMySql.

 

 

07: [opcional] Criando o arquivo docker-compose.yml

version: "3.2"
services:

  mysql-server-db:
    container_name: mysql-server-db
    image: preLoadedMySql:latest
    ports:
      - "3306:3306"

Este passo é opcional, mas gosto de fazer. Ele é um arquivo docker-compose simples. Se for utilizar, lembre-se de que o nome da imagem aqui deve ser o mesmo que você utilizou na hora de gerar a imagem.

 

 

Se quiser este exemplo pronto, basta olhar meu repositório no Github!

Espero ter ajudado!

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Conhecimento Técnico, Dev, Docker and tagged , , , .