Para fins de teste, quero construir um contêiner MySQL que tenha um conjunto de dados inicializado nele. Eu sei que a montagem é possível e que você pode colocar scripts sql no diretório init para executar a importação no início, mas não é isso que queremos. Então eu tentei construir um que apenas copia os arquivos de dados no contêiner docker.
Eu uso o seguinte dockerfile para construir meu contêiner.
FROM mysql:8.0.21
EXPOSE 3306
ARG BUILD_ID
LABEL stage=builder
LABEL build=$BUILD_ID
ENV TZ=Europe/Amsterdam
RUN apt-get update && apt-get install -y tzdata
ADD http://server.example.com/data/datafiles_2020_11_02.tar.gz /var/lib/datafile.tar.gz
RUN tar -xvzf /var/lib/datafile.tar.gz -C /var/lib/mysql && chown -R mysql.root /var/lib/mysql
#ADD initieel/* /docker-entrypoint-initdb.d/
ADD cnf/* /etc/mysql/mysql.conf.d/
Isso é executado com sucesso, então, depois, eu crio meu contêiner recém-construído e, durante a inicialização, algo no contêiner inicializará um banco de dados novo e jogará fora tudo o que coloquei em /var/lib/mysql. Eu verifiquei o README que vem com o container mysql, mas não há nada que eu possa encontrar relacionado a isso.
obrigado antecipadamente por tomar o tempo para ler. Vou atualizar se o meu post está faltando alguma informação.
A abordagem comum é especificar a inicialização somente quando for necessário.
Em vez de colocar
RUN tar -xvzf /var/lib/datafile.tar.gz
diretamente em seu Dockerfile, coloque-o em um script de shell que você adiciona ao seu contêiner, por exemplo, como/opt/mysql-bootstrap.sh
.Então, quando você criar seu contêiner pela primeira vez em um host, execute o docker com esse script.
O
--rm
irá remover o contêiner após a execução do script de inicialização. Depois, crie seu container que fica: