Установка MySQL в Debian используя Docker

Установка MySQL в Debian используя Docker

Здравствуйте! Сегодня хочу поделиться вариантом установки MySQL в Debian, используя команды внутри Dockerfile. Я надеюсь, что мы не будем задавать друг другу вопрос «Зачем?», и просто допустим, что кому-то кода-то бывает нужна база внутри контейнера с приложением. Код выложен здесь: https://github.com/webdevdiary/debian-docker-mysql.

Описание

Dockerfile выглядит так:

FROM debian AS with-mysql

SHELL ["/bin/bash", "-c"]

RUN apt-get update
RUN apt-get purge mysql-server mysql-common
RUN apt-get purge mysql-client
RUN apt-get install -y wget lsb-release gnupg

# RUN wget http://repo.mysql.com/mysql-apt-config_0.8.22-1_all.deb
# It's just a copy of the file above for caching purposes:
ADD ./mysql-apt-config_0.8.22-1_all.deb .

RUN printf "1\n1\n4\n" | dpkg -i mysql-apt-config_0.8.22-1_all.deb

RUN apt-get update

RUN debconf-set-selections <<< "mysql-community-server mysql-community-server/root-pass password mysql_test"
RUN debconf-set-selections <<< "mysql-community-server mysql-community-server/re-root-pass password mysql_test"
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install mysql-server

RUN mkdir -p /var/run/mysqld && \
    chown mysql /var/run/mysqld/

COPY --chmod=644 conf/mysql_startup.sh /mysql_startup.sh

USER mysql

CMD sh /mysql_startup.sh


FROM with-mysql AS testing

COPY --chmod=644 conf/mysql_connection_test.sh /mysql_connection_test.sh
COPY --chmod=644 conf/mysql_query_test.sh /mysql_query_test.sh

CMD sh /mysql_startup.sh && \
    until sh /mysql_connection_test.sh; do \
        sleep 10; \
    done; \
    sh /mysql_query_test.sh

docker-compose.yml так:

version: '3.9'
services:
    testing:
        build:
            context: .
            dockerfile: Dockerfile
            target: testing
        image: mysql-testing
        container_name: mysql-testing

conf/mysql_startup.sh (скрипт, инициализирующий базу):

#!/bin/sh

MYSQL_DATABASE=${MYSQL_DATABASE:-"mysql_test"}
MYSQL_USER=${MYSQL_USER:-"mysql_test"}
MYSQL_PASSWORD=${MYSQL_PASSWORD:-"mysql_test"}

tfile=`mktemp`
if [ ! -f "$tfile" ]; then
    return 1
fi

if [ "$MYSQL_DATABASE" != "" ]; then
  echo "[i] Creating database: $MYSQL_DATABASE"
  echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` CHARACTER SET utf8 COLLATE utf8_general_ci;" >> $tfile

  if [ "$MYSQL_USER" != "" ]; then
    echo "[i] Creating user: $MYSQL_USER with password $MYSQL_PASSWORD"
    echo "CREATE USER '$MYSQL_USER'@'localhost' IDENTIFIED BY '$MYSQL_PASSWORD';" >> $tfile
    echo "GRANT ALL ON \`$MYSQL_DATABASE\`.* to '$MYSQL_USER'@'localhost';" >> $tfile
  fi
fi

mysqld --verbose --init-file=$tfile &

conf/mysql_connection_test.sh (скрипт, проверяющий подключение к базе):

#!/bin/sh

mysql -umysql_test -pmysql_test mysql_test

conf/mysql_query_test.sh (скрипт, делающий тестовые запросы):

#!/bin/sh

mysql -umysql_test -pmysql_test mysql_test -e '
CREATE TABLE mysql_test (
  test_field text
);
INSERT INTO mysql_test (test_field) VALUES ("MySQL is working!!!");
SELECT * FROM mysql_test;
'

На этом, файлы заканчиваются.

Запуск

Запустить всю эту инфраструктуру можно этой командой:

docker-compose up

После чего, выведется подобное:

Attaching to mysql-testing
mysql-testing  | [i] Creating database: mysql_test
mysql-testing  | [i] Creating user: mysql_test with password mysql_test
mysql-testing  | mysql: [Warning] Using a password on the command line interface can be insecure.
mysql-testing  | ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
mysql-testing  | mysql: [Warning] Using a password on the command line interface can be insecure.
mysql-testing  | mysql: [Warning] Using a password on the command line interface can be insecure.
mysql-testing  | test_field
mysql-testing  | MySQL is working!!!
mysql-testing exited with code 0

Итог

Надеюсь, эта статья как-то сэкономила Ваше время и силы, ведь установка MySQL в Debian используя Docker — не самая простая задача, учитывая тот момент, что устанавливая MySQL на Debian, нужно вводить пароль пользователя root и выполнять прочий интерактив, который успешно решается хитрыми командами из представленного выше Dockerfile.

Всех благ!

Теги: , , ,

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *