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

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

Overview

Dando sequência à nossa aventura no mundo Docker, hoje trago um exemplo prático que é puro ouro: a criação de uma imagem MySQL que já vem com dados personalizados, pronta para ser utilizada. Vamos detalhar cada passo, desde escolher nossa imagem base até os comandos finais para deixa-la pronta para uso. Seja você um desenvolvedor em busca de aprimorar suas habilidades com Docker ou simplesmente um entusiasta por tecnologia, este post promete descomplicar o processo de forma leve e acessível. Preparado? Mãos à obra!

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!