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

Docker:在Tomcat映像构建期间访问MySQL容器,mysql,docker,dockerfile,expect,jahia,Mysql,Docker,Dockerfile,Expect,Jahia,我正在尝试创建一个Docker安装JahiaCMS(数字体验管理器) 我需要: 一个MySQL容器 一个Jahia容器(嵌入式Tomcat) 诀窍在于,在Jahia容器构建过程中(产品安装使用),我需要访问MySQL容器(需要进行连接检查) MySQL Dockerfile: FROM mysql:5.6 FROM centos:centos6 # Install dependencies RUN yum -y update && yum -y install ... #

我正在尝试创建一个Docker安装JahiaCMS(数字体验管理器)

我需要:

  • 一个MySQL容器
  • 一个Jahia容器(嵌入式Tomcat
  • 诀窍在于,在Jahia容器构建过程中(产品安装使用),我需要访问MySQL容器(需要进行连接检查)

    MySQL Dockerfile

    FROM mysql:5.6
    
    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 dockfile

    FROM mysql:5.6
    
    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)

    当然,我在生成映像时会出错,因为它会在数据库URL输入之后立即检查连接:

    建立与数据库的连接时出错 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通信链路故障

    成功发送到服务器的最后一个数据包为0毫秒 以前驱动程序尚未从服务器收到任何数据包

    事实上,我只是在构建Jahia映像,因此
    mysql
    容器还无法访问(即使正在运行)

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

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

    请注意,docker提交中不包括卷,因为它们位于docker的union文件系统之外。看起来您并没有在Dockerfile中声明任何卷,所以对您来说可能不会有问题。
    详细介绍docker提交和数据库卷,但前提对于任何容器都是一样的

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

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

    这意味着MySQL容器应该在一个单独的进程中安装DB。例如,在我们这边,我们通过直接在数据库上运行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>
    
    
    

    这假设您在某处有一个DB服务器。在我们这方面,我们使用了一个假实例,因为我们请求在构建过程中不进行安装。

    在容器构建过程中,您绝对需要访问mysql吗?有什么原因不能将
    expect/tmp/configuration.exp
    和启动Jahia的最后一个命令放入在container start上运行的entrypoint.sh中吗?如果我将其作为entrypoint,它将在每次停止/启动container时安装整个CMS。但是Jahia安装要求数据库启动,否则它会失败。我没有选择在构建时检查,这是Jahia安装过程要求的。(Expect只是一个工具,允许在安装过程中出现提示时自动发送用户输入,它与问题没有直接联系,我可以在问题中忽略它)。我再次检查了我们的代码,您是对的,在构建过程中进行了数据库检查。我们通过jar使用安装,提供一个xml文件作为参数(因此在本例中不需要Expect)。我将更新我的答案以提供xml部分。实际上Expect做的事情与izpack大致相同。我可以使用一个假的MySQL实例进行安装,但我怀疑Jahia也在那里进行一些配置,因此在安装后简单地修改DB设置以使用容器化的设置可能会有风险。我会联系Jahia支持人员,征求他们对此的意见。最后,我只是使用了您评论中提到的解决方案,即在容器运行时执行Jahia安装。因此,我将一个shell脚本设置为entrypoint命令(docker compose),在该脚本中,我只需检查Jahia是否已经安装,并仅在需要时启动安装。这样我就可以重建/重新启动图像/容器,而不用担心每次提交。