Docker:在 Tomcat 映像构建期间访问 MySQL 容器

Docker : accessing MySQL container during Tomcat image build

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

我需要:

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

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

MySQL Docker文件 :

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 输入后立即检查连接:

An error occurred while establishing the connection to the database com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server..

事实上,我只是在构建 Jahia 映像,因此 mysql 容器尚不可访问(即使 运行)。

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

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

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

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

不幸的是,我不知道 'expect' 工具是如何工作的,但理想情况下,您应该 link 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>

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