Docker: instància de mysql server

De wikijoan
Salta a la navegació Salta a la cerca

Introducció

Les imatges oficials de mysql:

$ sudo docker pull mysql/mysql-server
Using default tag: latest

L'arrenquem i l'executem:

$ sudo docker run --name=mysql1 -d mysql/mysql-server:latest

$ sudo docker exec -t -i b24aaf2abddc /bin/bash

$ sudo docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED              STATUS                        PORTS                       NAMES
132c5cefe79f   mysql/mysql-server:latest   "/entrypoint.sh mysq…"   About a minute ago   Up About a minute (healthy)   3306/tcp, 33060-33061/tcp   mysql1

$ sudo docker exec -t -i 132c5cefe79f /bin/bash
bash-4.4 # exit

per saber el password:

$ sudo docker logs mysql1 2>&1 | grep GENERATED
[Entrypoint] GENERATED ROOT PASSWORD: zuE#2PK;/5c^1Of94.nIqo6%%CMk_8T8

I ara que ja sabem el password del root, hem d'entrar a dins del mysql i canviar el password:

$ sudo docker exec -it mysql1 mysql -uroot -p

mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';

Aquesta és una manera ràpid i fàcil de connectar-se a mysql amb un docker

Per eliminar-lo:

Primer l'apaguem:

$ sudo docker kill 132c5cefe79f

després l'eliminem

$ sudo docker rmi mysql/mysql-server:latest -f
$ sudo docker images -> ja no hi és

Per tenir un docker amb el mysql he fet un pull.

Però també publiquen el Dockerfile:

i per tant el puc construir a partir del script. En comptes de fer un pull, copio el fitxer Dockerfile de https://github.com/mysql/mysql-docker/blob/mysql-server/8.0/Dockerfile i el copio en local i el renombro a Dockerfile2, i a partir d'aquest fitxer puc muntar el meu docker:

$ sudo docker build -f Dockerfile2 .
$ sudo docker run --name=mysql1 -d mysql/mysql-server:latest

Es crea bé, però no té nom (no es crea bé, que no tingui nom vol dir que hi ha hagut un error. Sempre ha d'acabar amb successfully):

$ sudo docker image ls
REPOSITORY               TAG       IMAGE ID       CREATED          SIZE
<none>                   <none>    740e3aa2ac62   26 seconds ago   406MB

eliminem:

$ sudo docker rmi 740e3aa2ac62 -f

per posar un nom al meu docker:

-t: tag an image

$ sudo docker build -t joan/mysql_prova:1.0 -f ./Dockerfile2 .

$ sudo docker image ls
REPOSITORY               TAG       IMAGE ID       CREATED         SIZE
joan/mysql_prova         1.0       9f04fb2e652f   5 seconds ago   132MB

si no posa un nom i surt un <none>, significa que hi ha hagut un error en el procés.

L'error ve de què s'espera que els fitxers docker-entrypoint.sh i healthcheck.sh estiguin en el directori local, i per tant faig un wget per descarregar-los:

$ wget https://raw.githubusercontent.com/mysql/mysql-docker/mysql-server/8.0/healthcheck.sh

Finalment:

$ sudo docker build -t joan/mysql_prova:1.0 -f ./Dockerfile2 .

$ sudo docker exec -t -i 8c7535c45e10 /bin/bash

ara ja ha funcionat, i puc fer un run:

$ sudo docker run --name=mysql1 -d joan/mysql_prova:1.0

Per netejar: https://docs.docker.com/config/pruning/

el password: abans de fer el exec, he de posar el password:

$ sudo docker logs mysql1 2>&1 | grep GENERATED
[Entrypoint] GENERATED ROOT PASSWORD: ZuxazYPiw#as@cakKYrZEchoGJY

$ sudo docker exec -it mysql1 mysql -uroot -p

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';

mysql> \! ls /etc/dades_municipis_mysql.sql
/etc/dades_municipis_mysql.sql

Finalment:
mysql> \. /etc/dades_municipis_mysql.sql

He carregat la base de dades de municipis.

I aquesta és la manera com puc fer més funcional el docker amb mysql

El fitxer Dockerfile_mysql queda de la següent manera:

 FROM oraclelinux:7-slim

ARG MYSQL_SERVER_PACKAGE=mysql-community-server-minimal-8.0.23
ARG MYSQL_SHELL_PACKAGE=mysql-shell-8.0.22

# Install server
RUN yum install -y https://repo.mysql.com/mysql-community-minimal-release-el7.rpm \
      https://repo.mysql.com/mysql-community-release-el7.rpm \
  && yum-config-manager --enable mysql80-server-minimal \
  && yum install -y \
      $MYSQL_SERVER_PACKAGE \
      $MYSQL_SHELL_PACKAGE \
      libpwquality \
  && yum clean all \
  && mkdir /docker-entrypoint-initdb.d

VOLUME /var/lib/mysql

#s'espera que aquests dos fitxers estiguin presents en el directori local
COPY ./docker-entrypoint.sh /entrypoint.sh
COPY ./healthcheck.sh /healthcheck.sh
RUN chmod 777 /entrypoint.sh
RUN chmod 777 /healthcheck.sh
ENTRYPOINT ["/entrypoint.sh"]
HEALTHCHECK CMD /healthcheck.sh
EXPOSE 3306 33060 33061
CMD ["mysqld"]

COPY ./municipis/dades_municipis_mysql.sql /etc/dades_municipis_mysql.sql

Ara el següent pas seria que en comptes de carregar manualment la bd de municipis, en el procés d'instal·lació ja es carregués aquesta bd i totes les bd que necessito.

(TBD)

problema Transaction check error

Solució: he d'agafar la última versió del Dockerfile

Source of this image: The Image repository for the mysql/mysql-server container:

mysql-server > 8.0:

I aquí és on trobo el Dockerfile correcte:

Dockerfile (3 days ago)
docker-entrypoint.sh
healthcheck.sh
prepare-image.sh

Partint d'aquest Dockerfile no tindré el problema de Transaction check error:

Transaction check error:
  file /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql conflicts between attempted installs

Abans agafava el Dockerfile de

que té mesos d'antiguitat

M'anava bé, fins que en un moment donat, quan estava fent proves per l'assignatura de DAM-M02, em donava l'error:

...
Total size: 34 k
Installed size: 34 k
Downloading packages:
Running transaction check
Running transaction test


Transaction check error:
  file /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql conflicts between attempted installs of mysql-community-minimal-release-el7-1.noarch and mysql80-community-release-el7-3.noarch



creat per Joan Quintana Compte, juliol 2021