0

我正在尝试创建Jahia CMS(数字体验管理器)的Docker安装。

我需要 :

  1. 一个MySQL容器
  2. Jahia容器(嵌入式Tomcat

诀窍是在 Jahia 容器构建期间(使用Expect安装产品),我需要访问 MySQL 容器(需要连接检查)。

MySQL Docker 文件

FROM mysql:5.6

Jahia 码头文件

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容器还无法访问(即使正在运行)。

如何处理这种情况(在构建过程中需要访问另一个容器时)?

4

2 回答 2

1

由于 MySQL 服务器也将在一个容器中,我认为您不应该在构建时配置它,因为您不能假设数据库会启动。

不幸的是,我不知道“期望”工具是如何工作的,但理想情况下,您应该仅在容器启动时链接 Jahia 容器中的数据库。这可以通过配置注入来完成(环境变量或启动容器时可以注入的其他东西)

这意味着 MySQL 容器应该将数据库安装在一个单独的进程中。例如,在我们这边,我们通过直接在数据库上运行 jahia 代码中提供的 sql 脚本来实现这一点。

使用此解决方案,您可以确保在构建时不需要预安装数据库。

编辑:确实,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>

这假设您不幸在某处有一个数据库服务器。在我们这边,我们使用假实例,因为我们要求在构建期间不进行安装。

于 2018-02-26T08:44:26.623 回答
0

尝试使用docker commit。您可能必须通过执行configuration.exp到您的容器中来运行脚本来设置 Jahia。然后使用 docker commit 将对文件系统的更改保存到新映像中。该图像应保留初始配置。

请注意,卷不包含在 docker 提交中,因为它们位于 Docker 的联合文件系统之外。看起来您没有在 Dockerfile 中声明任何卷,因此这对您来说可能不是问题。 这个答案详细说明了 docker commit 和数据库卷,但前提对于任何容器都是相同的。

于 2018-02-17T22:23:29.767 回答