Docker TeamCity internal DB migration to MySQL

Я использую Docker вместе с Docker Compose для удобства работы с несколькими Docker-контейнерами. Начал изучать приложение TeamCity от JetBrain, много чего настроил и понял, что буду его использовать как удобный инструмент Continuous Integration. Разработчики настоятельно рекомендуют не использовать встроенную базу данных TeamCity сервера для продакшена, поэтому решил мигрировать на внешнюю СУБД. В наших проектах используется PostgreSQL, но так как я люблю зоопарк, решил разнообразить и без того перегруженный контейнерами Docker Compose и создать ещё одну конфигурацию для Docker-контейнера MySQL сервера. Такой уж я DevOps со странностями.

Структура папок и файлов Docker Compose:

/data/docker/docker-compose.yml
/data/docker/containers/teamcity/Dockerfile
/data/docker/containers/mysql/Dockerfile
/data/teamcity
/data/mysql
/data/logs/teamcity
/data/logs/mysql

docker-compose.yml

version: ‘2.1’
services:
  tc-server:
    image: profinch_tc-server
    container_name: pro_tc-server
    hostname: tc-server-container
    build: ./containers/teamcity
    restart: always
    ports:
      — 80:8111
      — 443:8543
    volumes:
      — /data/teamcity:/data/teamcity_server/datadir
      — /data/logs/teamcity:/opt/teamcity/logs
    links:
      — mysql
  mysql:
    image: profinch_mysql
    container_name: pro_mysql
    hostname: mysql-container
    build: ./containers/mysql
    restart: always
    ports:
      — 3306:3306
    volumes:
      — /data/mysql:/var/lib/mysql
      — /data/logs/mysql:/var/log/mysql
    environment:
      — MYSQL_ROOT_PASSWORD=[password]
      — MYSQL_USER=[username]
      — MYSQL_PASSWORD=[password]

Необходимо скачать Java драйвер для подключения к серверу базы данных MySQL (jdbc driver):
1. Открываем в браузере https://dev.mysql.com/downloads/connector/j/
2. Выбираем Platform Independent и скачиваем последний драйвер.
На момент написания статьи это был файл mysql-connector-java-8.0.15.tar.gz (https://dev.mysql.com/downloads/file/?id=484818)
3. В операционной системе Debian:
debian$ wget https://dev.mysql.com/downloads/file/?id=484818
debian$ tar tf mysql-connector-java-8.0.15.tar.gz | grep "mysql-connector-java-*.jar"
mysql-connector-java-8.0.15/mysql-connector-java-8.0.15.jar
debian$ tar xf mysql-connector-java-8.0.15.tar.gz mysql-connector-java-8.0.15/mysql-connector-java-8.0.15.jar
debian$ cp mysql-connector-java-8.0.15.jar /data/docker/containers/teamcity

TeamCity Dockerfile

FROM jetbrains/teamcity-server
MAINTAINER profinch <[email protected]>
# copy jdbc driver
RUN mkdir /opt/teamcity/lib/jdbc
COPY mysql-connector-java-8.0.15.jar /opt/teamcity/lib/jdbc

MySQL Dockerfile

FROM mariadb:latest
MAINTAINER profinch <[email protected]>

Запускаем Docker Compose:
debian$ cd /data/docker
debian$ docker-compose up -d

Проверяем, что Docker-контейнеры запущены:
debian$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1cd3b2d77902 profinch_mysql "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:3306->3306/tcp pro_mysql
d3e44b4c1ceb profinch_tc-server "/run-services.sh" About an hour ago Up About an hour 0.0.0.0:80->8111/tcp, 0.0.0.0:443->8543/tcp pro_tc-server

До того, как выполнить миграцию, необходимо создать пустую базу данных в MySQL. Заходим в Docker-контейнер MySQL, создаём базу данных и даём полный доступ пользователю из конфигурации Docker Compose:
debian$ docker-compose exec mysql bash
mysql-container$ mysql -u root -p
password: [password]
mysql: create database [database-name] collate utf8_bin;
mysql: grant all privileges on [database-name].* to [username];
mysql: grant process on *.* to [username];

Теперь, для миграции, нам необходимо скопировать файл базовых настроек для соединения с MySQL во временный файл и прописать в нём наши данные. Существующий файл database.properties не изменяем и не удаляем.
debian$ cd /data/teamcity/config
debian$ cp database.mysql.properties database.temp.properties
debian$ nano database.temp.properties
connectionUrl=jdbc:mysql://mysql:3306/[database-name]
connectionProperties.user=[username]
connectionProperties.password=[password]

Наконец, внутри Docker контейнера TeamCity сервера выполняем миграцию и перезагружаем Docker-контейнер:
debian$ docker-compose exec teamcity bash
teamcity-container$ cd /opt/teamcity/bin
teamcity-container$ bash maintainDB.sh migrate -A /data/teamcity_server/datadir -T /data/teamcity_server/datadir/config/database.temp.properties
migration process...
teamcity-container$ exit
debian$ docker restart pro_tc-server

Обсуждение закрыто.