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

时间:2018-02-16 12:54:13

标签: mysql docker dockerfile expect jahia

我正在尝试创建 Jahia CMS(Digital Experience Manager)的 Docker 安装。

我需要:

  1. MySQL 容器
  2. Jahia 容器(嵌入式 Tomcat
  3. 诀窍是在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容器尚不可访问(即使正在运行)。

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

2 个答案:

答案 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提交和数据库卷,但前提是任何容器都是相同的。