Docker: доступ к контейнеру MySQL во время сборки образа Tomcat
Я пытаюсь создать Docker для установки Jahia CMS (Digital Experience Manager).
Я нуждаюсь:
- контейнер MySQL
- контейнер Jahia (встроенный Tomcat)
Хитрость в том, что во время сборки контейнера Jahia (установка продукта с использованием Expect) мне нужно получить доступ к контейнеру MySQL (требуется проверка соединения).
MySQL Dockerfile:
FROM mysql:5.6
Джахия Докфил:
FROM centos:centos6
# Install dependencies
RUN yum -y update && yum -y install ...
# Download Digital Experience Manager 7.1.1
RUN wget -q https://www.jahia.com/downloads/jahia/digitalexperiencemanager7.1.1/DigitalExperienceManager-EnterpriseDistribution-7.1.1.0-r53717.3663.jar -O /tmp/DigitalExperienceManager.jar
# Download MySQL connector (only needed for standalone db installation)
RUN wget -q http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.44/mysql-connector-java-5.1.44.jar -O /usr/lib/mysql-connector-java-5.1.44.jar
# Launch installation using Expect to automate user input
COPY jahia_conf.exp /tmp/configuration.exp
RUN expect /tmp/configuration.exp
# Start Jahia
/opt/DigitalExperienceManager-EnterpriseDistribution-7.1.1.0/tomcat/bin/catalina.sh jpda run
Ожидать сценарий (jahia_conf.exp)
#!/bin/sh
#!/usr/bin/expect
spawn java -jar /tmp/DigitalExperienceManager.jar -console
# Installation directory
expect "Select target path"
send "/opt/DigitalExperienceManager-EnterpriseDistribution-7.1.1.0\r"
# MySQL connector JAR file
expect "Specify the path to the downloaded driver JAR file"
send "/usr/lib/mysql-connector-java-5.1.44.jar\r"
# Database configuration
expect "Database URL (*)"
send "jdbc:mysql://mysql:3306/jahia?useUnicode=true&characterEncoding=UTF-8&useServerPrepStmts=false\r"
Конечно, я получаю сообщение об ошибке во время сборки изображения, потому что оно проверяет соединение сразу после ввода URL базы данных:
Произошла ошибка при установлении соединения с базой данных com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: сбой канала связи
Последний пакет, успешно отправленный на сервер, был 0 миллисекунд назад. Драйвер не получил никаких пакетов с сервера.
На самом деле я просто создаю образ Джахии, поэтому mysql
Контейнер еще не доступен (даже если запущен).
Как справиться с такой ситуацией (когда вам нужен доступ к другому контейнеру во время сборки)?
2 ответа
Попробуйте использовать docker commit. Возможно, вам придется запустить configuration.exp
скрипт для настройки Jahia, выполнив в ваш контейнер. Затем используйте docker commit для сохранения изменений в файловой системе в новом образе. Это изображение должно сохраняться в начальной конфигурации.
Помните, что тома не включены в фиксацию Docker, так как они находятся за пределами объединенной файловой системы Docker. Не похоже, что вы объявляете какие-либо тома в своем Dockerfile, так что это, вероятно, не будет проблемой для вас. В этом ответе подробно рассматриваются объем фиксации док-станции и объемы базы данных, но предпосылка для всех контейнеров одинакова.
Поскольку сервер MySQL также будет находиться в контейнере, я не думаю, что вам следует настраивать его во время сборки, поскольку вы не можете предполагать, что база данных будет работать.
К сожалению, я не знаю, как работает инструмент "ожидаем", но в идеале вам следует связывать контейнер "База данных в Jahia" только при запуске контейнера. Это можно сделать, внедрив его через конфигурацию (переменная окружения или что-то еще, что вы можете вставить при запуске контейнера)
Это означает, что в контейнере MySQL БД должна быть установлена в отдельном процессе. С нашей стороны, например, мы делаем это, запуская сценарий sql, предоставленный в коде jahia, непосредственно в базе данных.
С этим решением вы гарантируете, что вам не нужна предустановленная база данных при сборке.
edit: действительно, Jahia выполняет некоторые проверки базы данных во время сборки, но вы можете добавить входные данные, чтобы Jahia фактически не нужно было выполнять операции с БД. Используется файл автозапуска izpack. Это позволяет повторить установку.
Часть настройки БД следующая:
<com.izforge.izpack.panels.UserInputPanel id="dbSettings">
<userInput>
<entry key="dbSettings.connection.url.mssql" value="jdbc:sqlserver://DB_SERVER;DatabaseName=DB_NAME;"/>
<entry key="dbSettings.dbms.createTables" value="false"/>
<entry key="dbSettings.connection.username" value="DB_USER"/>
<entry key="dbSettings.dbms.storeFilesInDB" value="false"/>
<entry key="dbSettings.connection.driver.mssql" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<entry key="dbSettings.connection.password" value="DB_PASSWORD"/>
</userInput>
</com.izforge.izpack.panels.UserInputPanel>
Это предполагает, что у вас есть сервер БД где-то, к сожалению. С нашей стороны мы используем поддельный экземпляр, так как мы просим не делать установку во время сборки.