我正在尝试创建 Jahia CMS(Digital Experience Manager)的 Docker 安装。
我需要:
诀窍是在Jahia容器构建(使用Expect进行产品安装)期间,我需要访问MySQL容器(需要连接检查)。
MySQL Dockerfile :
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
容器尚不可访问(即使正在运行)。
如何处理这种情况(在构建期间需要访问另一个容器时)?
答案 0 :(得分:1)
由于MySQL服务器也将在一个容器中,我认为你不应该在构建时配置它,因为你不能假设数据库将会启动。
不幸的是,我不知道'expect'工具是如何工作的,但理想情况下,你应该只在容器启动时链接Jahia容器中的Database。这可以通过配置注入来完成(环境变量或启动容器时可以注入的其他东西)
这意味着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>
这假设你不幸在某个地方有一个数据库服务器。在我们这边,我们使用假实例,因为我们要求在构建期间不进行安装。
答案 1 :(得分:0)
尝试使用docker commit。您可能必须运行configuration.exp
脚本以通过exec进入容器来设置Jahia。然后使用docker commit将对文件系统的更改保存到新映像中。该图像应该保留初始配置。
请注意,Docker提交中不包含卷,因为它们位于Docker的union文件系统之外。它看起来不像你在Dockerfile中声明任何卷,所以它可能不会对你有任何问题。 This answer详细阐述了docker提交和数据库卷,但前提是任何容器都是相同的。