Docker: доступ к контейнеру MySQL во время сборки образа Tomcat

Я пытаюсь создать Docker для установки Jahia CMS (Digital Experience Manager).

Я нуждаюсь:

  1. контейнер MySQL
  2. контейнер 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>

Это предполагает, что у вас есть сервер БД где-то, к сожалению. С нашей стороны мы используем поддельный экземпляр, так как мы просим не делать установку во время сборки.

Другие вопросы по тегам