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!