使用alpine创建一个能够运行intra-mart的Docker容器

总结主要内容

受到intra-mart启动Docker容器的启发,我决定尝试一下,结果有点生气。

将intra-mart环境构建在Docker容器上。

在轻量级且备受传言的Alpine上。虽然在Ubuntu上可以用apt-get安装resin,但现在时光变了呢。

这次的目标是以下的感觉。
– 确认可以使用”/imart/login”登录到已创建的租户管理员。
– imart.war将被转移到外部。
– 数据库将使用单独建立的容器。
– 不需要准备Web服务器(如Apache)。
– 不包括IMBox和IM-ContentSearch(因为需要Cassandra和Solr)。

这是每个应用程序的版本,都进行了测试。

applicationversion説明Resin Pro4.0.48本家が配布しているものを利用します。OpenJDK1.8.0_92apkでインストールされるものを利用します。intra-mart8.0.13(Maxima)2016 Springを利用します。PostgreSQL9.5.3DockerHubで配布されているlatestを利用します。

虽然系统要求没有百分之百满足,但这一点并不重要。重要的是达成理解和相互关系。

本家的resin-pro不包含许可证,因此您需要自行安装许可证。即使不安装,似乎也能持续约30天。

如果在intra-mart上运行的应用程序不是Oracle,那就假装没看到。

提前准备好的事物

    • imart.war

 

    postgresのjdbcドライバ (postgresql-9.4.1208.jar)

从intra-mart Accel系列的TRY版下载IM-Juggling工具,然后创建war文件。

请参考《启迪》上有关详细步骤的说明。

关于resin-web.xml的内容

如果将preparedStatementCacheQueries的值设置为0或8或较小的值,那么在租户设置期间会出现错误并导致痛苦。

虽然本家手册提供了将20作为输入值的示例,但是尝试使用该示例却导致了错误。

在进行intra-mart租户环境设置时,如果出现java.sql.SQLException,应采取如下对策。


<database jndi-name="jdbc/default">
        <driver>
            <type>org.postgresql.Driver</type>
            <url>jdbc:postgresql://postgres:5432/iap_db</url>
            <user>imart</user>
            <password>imart</password>
            <init-param>
                <param-name>preparedStatementCacheQueries</param-name>
                <param-value>8</param-value>
            </init-param>
        </driver>
        <max-connections>20</max-connections>
        <prepared-statement-cache-size>8</prepared-statement-cache-size>
    </database>

创建用于Docker构建的文件 (Cjù chù jù Docker dì

Dockerfile

我写了一个类似以下的Dockerfile。
只要有Java就好了,这种甜蜜的想法将在制作Resin阶段被打破。
而且,在制作时还需要jni.h。因此,在Resin制作完成后,会根据需要使用apk del进行删除。(为了减肥)

在alpine的网站上,我们会寻找所需的文件以及包含这些文件的软件包。


FROM alpine:3.4

ENV RESIN_VERSION 4.0.48
ENV RESIN_HOME /opt/resin-pro-${RESIN_VERSION}
ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk

RUN apk add --virtual=build-dependencies --no-cache g++ libstdc++ linux-headers make wget ca-certificates && \
    apk add --no-cache openjdk8 && \
    ALPINE_GLIBC_BASE_URL="https://github.com/sgerrand/alpine-pkg-glibc/releases/download" && \
    ALPINE_GLIBC_PACKAGE_VERSION="2.23-r3" && \
    ALPINE_GLIBC_BASE_PACKAGE_FILENAME="glibc-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
    ALPINE_GLIBC_BIN_PACKAGE_FILENAME="glibc-bin-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
    ALPINE_GLIBC_I18N_PACKAGE_FILENAME="glibc-i18n-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
    wget \
        "https://raw.githubusercontent.com/andyshinn/alpine-pkg-glibc/master/sgerrand.rsa.pub" \
        -O "/etc/apk/keys/sgerrand.rsa.pub" && \
    wget \
        "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
        "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
        "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \
    apk add --no-cache \
        "$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
        "$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
        "$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \
    \
    rm "/etc/apk/keys/sgerrand.rsa.pub" && \
    /usr/glibc-compat/bin/localedef --force --inputfile POSIX --charmap UTF-8 C.UTF-8 || true && \
    echo "export LANG=C.UTF-8" > /etc/profile.d/locale.sh && \
    \
    apk del glibc-i18n && \
    \
    rm "/root/.wget-hsts" && \
    rm \
        "$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
        "$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
        "$ALPINE_GLIBC_I18N_PACKAGE_FILENAME"

ENV LANG=C.UTF-8

RUN wget http://caucho.com/download/resin-pro-${RESIN_VERSION}.tar.gz -P /usr/local && \
    cd /usr/local && \
    tar xvzf resin-pro-${RESIN_VERSION}.tar.gz && \
    rm -f resin-pro-${RESIN_VERSION}.tar.gz && \
    cd resin-pro-${RESIN_VERSION} && \
    ./configure --prefix=/opt/resin-pro-${RESIN_VERSION} --enable-64bit && \
    make && \
    make install && \
    rm -rf /usr/local/resin-pro-4.0.48 && \
    ln -s /opt/resin-pro-${RESIN_VERSION} /opt/resin && \
    apk del build-dependencies 


EXPOSE 8080

ENTRYPOINT ["/opt/resin/bin/resinctl"," -server", "app-0", " start-with-foreground"]


尽管实际上需要适当编辑resin.properties等文件,但即使在没有进行操作确认的水平下,也可以设法解决。
我决定坚决地继续前进。

构建Docker镜像

执行Docker构建,创建镜像。

docker build -t imart-base:4.0.48 .

准备 PostgreSQL

获取和启动图像

docker run --name postgres -d -e PGPASSWORD=postgres -e POSTGRES_USER=postgres -p 5432:5432 postgres:latest

目前最新版本为9.5.3。

创建与intra-mart连接的角色。

根据数据库和登录角色的创建参考,创建一个角色。

这次由于PostgreSQL也是一个容器,所以我按照以下方式尝试了一下。

首先,将容器连接起来。

docker exec -it postgres bash

请连接到PostgreSQL。

psql -U postgres

创建角色和数据库。

postgres=# CREATE ROLE imart WITH LOGIN PASSWORD 'imart';
CREATE ROLE

postgres=# CREATE DATABASE iap_db OWNER imart ENCODING 'utf8';   
CREATE DATABASE

启动树脂容器。

首先,假设预先准备好的文件如下。

    • /home/intramart/war/*.war (IM-Jugglingで作成したwarファイル)

 

    /home/intramart/lib/*.jar (JDBCドライバ)

我决定在运行Docker时挂载并传递这个。

我将先启动的PostgreSQL通过–link参数传递给它。

docker run -it -d –name intra -p 8080:8080 –link postgres:postgres -v /home/intramart/war/:/opt/resin/webapps -v /home/intramart/lib/:/opt/resin/webapp-jars imart-base:4.0.48

过了一段时间,war文件会被解压并启动Resin。

租户设置和登录确认

当您访问以下链接时,将会显示初始设置页面。请按照向导进行操作。

http://<Docker主机的IP地址>:8080/imart/system/login

当您以系统管理员身份登录后,将会出现以下类似的屏幕。

システム管理者ホーム.png

访问以下链接,并确认租户管理员可以登录。

http://<Dockerのホスト>:8080/imart/login
ポータル.png

赠品

树脂容器的图像大小

場所サイズUbuntu(ビルドしている環境)337.3MBGitlab Registry123 MB

Docker的主机是Ubuntu 16。也许可以再精简一些。

Container Registry.png
广告
将在 10 秒后关闭
bannerAds