Установка 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.
Всех благ!