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

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

Я нуждаюсь :

  1. контейнер MySQL
  2. контейнер Jahia (встроенный Tomcat)

Хитрость в том, что во время сборки контейнера Jahia (установка продукта с использованием ожидания), мне нужно получить доступ к контейнеру MySQL (требуется проверка соединения).

Файл Docker для MySQL:

FROM mysql:5.6

Jahia Dockefile :

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 миллисекунд назад. Драйвер не получил никаких пакетов от сервера.

На самом деле я просто собираю образ Jahia, поэтому контейнер mysql еще недоступен (даже если он запущен).

Как поступить в такой ситуации (когда вам нужно получить доступ к другому контейнеру во время сборки)?


person Yann39    schedule 16.02.2018    source источник
comment
Вам абсолютно необходим доступ к mysql во время сборки контейнера? Есть ли причина, по которой вы не можете поместить expect /tmp/configuration.exp и последнюю команду для запуска Jahia в entrypoint.sh, который запускается при запуске контейнера?   -  person bluescores    schedule 16.02.2018
comment
Если я поставлю его как точку входа, он будет устанавливать всю CMS каждый раз, когда я останавливаю/запускаю контейнер.   -  person Yann39    schedule 16.02.2018


Ответы (2)


Попробуйте использовать коммит docker. Возможно, вам придется запустить скрипт configuration.exp для настройки Jahia, выполнив его в своем контейнере. Затем используйте фиксацию docker, чтобы сохранить изменения в файловой системе в новый образ. Этот образ должен сохранить исходную конфигурацию.

Помните, что тома не включаются в фиксацию Docker, поскольку они находятся за пределами объединенной файловой системы Docker. Не похоже, что вы объявляете какие-либо тома в своем Dockerfile, поэтому, вероятно, это не будет для вас проблемой. Этот ответ подробно описывает фиксацию докера и базу данных объемы, но предпосылка одинакова для любого контейнера.

person bluescores    schedule 17.02.2018
comment
Наконец, я просто использовал решение, указанное в вашем комментарии, а именно выполнение установки Jahia при запуске контейнера. Поэтому я установил сценарий оболочки в качестве команды точки входа (docker compose), в которой я просто проверяю, установлена ​​ли уже Jahia, и запускаю установку только при необходимости. Таким образом, я могу пересобрать/перезапустить свои образы/контейнеры, не беспокоясь о фиксации каждый раз. - person Yann39; 08.03.2018

Поскольку сервер MySQL также будет находиться в контейнере, я не думаю, что вам следует настраивать его во время сборки, так как вы не можете предположить, что база данных будет работать.

К сожалению, я не знаю, как работает инструмент «ожидание», но в идеале вы должны связывать базу данных в контейнере Jahia только при запуске контейнера. Это можно сделать, введя его через конфигурацию (переменная среды или что-то еще, что вы можете ввести при запуске контейнера).

Это означает, что в контейнере MySQL должна быть установлена ​​БД в отдельном процессе. С нашей стороны, например, мы делаем это, запуская сценарий sql, предоставленный в коде jahia, непосредственно в базе данных.

С помощью этого решения вы гарантируете, что вам не потребуется предварительно устанавливать базу данных во время сборки.

изменить: действительно, 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>

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

person Romain Blineau    schedule 26.02.2018
comment
Но установка Jahia запрашивает, чтобы база данных была включена, иначе она не работает. Я не хочу проверять это во время сборки, это запрашивает процесс установки Jahia. (Expect — это просто инструмент, который позволяет автоматически отправлять пользовательский ввод при появлении запроса во время процесса установки, он не связан напрямую с проблемой, я мог бы проигнорировать его в вопросе). - person Yann39; 26.02.2018
comment
Я еще раз проверил наш код, и вы правы, во время сборки есть проверка базы данных. Мы используем установку через банку, предоставляя в качестве параметра файл xml (поэтому в нашем случае нам не нужен Expect). Я обновлю свой ответ, чтобы предоставить часть xml. - person Romain Blineau; 27.02.2018
comment
На самом деле Expect делает примерно то же самое, что и izpack. Я мог бы использовать поддельный экземпляр MySQL для установки, но я подозреваю, что Jahia также выполняет некоторую настройку там, поэтому может быть рискованно просто вернуться, чтобы изменить настройки БД после установки, чтобы использовать контейнеризованный. Я свяжусь со службой поддержки Jahia, чтобы узнать их мнение по этому поводу. - person Yann39; 28.02.2018