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!
Latest posts by Breno RdV (see all)
- Estamos de mudança! - abril 28, 2024
- O que é Metaclass e como ela funciona. (#python #dev #metaclass) - janeiro 11, 2023
- Entenda a mágica dos Generators. (#python, #dev, #generator, #iterator) - dezembro 28, 2022