全部產品
Search
文件中心

Serverless App Engine:製作Java鏡像

更新時間:Sep 03, 2024

Spring Cloud、Dubbo、HSF架構下開發並編譯的應用WAR包或JAR包,如果需要在Serverless 應用引擎 SAE(Serverless App Engine)上以鏡像方式部署,需要將WAR包或JAR包製作為應用鏡像,以便部署時使用。本文介紹鏡像製作的使用規範、以不同程式碼封裝編譯的Java應用的鏡像製作過程、以及將鏡像上傳至鏡像倉庫的操作步驟。

使用規範

通過Dockerfile製作自訂鏡像時,SAE在運行時會自動注入以下環境變數資訊。

重要
  • 為保證應用正常運行,請勿覆蓋以下配置。

  • 請勿使用/home/admin/.spas_key/default檔案,該檔案在POD運行時將會被覆蓋。

  • 請勿使用VOLUMESUSER root欄位,否則應用運行時可能會導致檔案丟失。

環境變數Key

描述

POD_IP

POD的IP地址。

EDAS_APP_ID

部署在SAE上應用的ID。

EDAS_ECC_ID

匯入叢集的ECS在應用中部署後的ID。

EDAS_PROJECT_NAME

EDAS_ECC_ID類似,用於調用鏈解析。

EDAS_JM_CONTAINER_ID

EDAS_ECC_ID類似,用於調用鏈解析。

EDAS_CATALINA_OPTS

中介軟體運行時所需的CATALINA_OPTS參數。

CATALINA_OPTS

EDAS_CATALINA_OPTS類似,預設Tomcat啟動參數。

CATALINA_HOME

安裝的Tomcat路徑。

PANDORA_LOCATION

安裝的Pandora路徑,僅HSF應用中可見。

Spring Cloud或Dubbo應用的Dockerfile樣本(基於JAR包)

FROM centos:7
LABEL maintainer="SAE R&D team"

# 安裝打包必備軟體。
RUN yum -y install wget unzip telnet

# 準備JDK以及Tomcat系統變數。
ENV JAVA_HOME /usr/java/latest
ENV PATH $PATH:$JAVA_HOME/bin
ENV ADMIN_HOME /home/admin

# 下載安裝OpenJDK。
RUN yum -y install java-1.8.0-openjdk-devel

# 下載部署SAE示範JAR包。
RUN mkdir -p /home/admin/app/ && \
         wget http://sae-demo-cn-shenzhen.oss-cn-shenzhen.aliyuncs.com/demo/1.0/hello-edas-0.0.1-SNAPSHOT.jar -O /home/admin/app/hello-edas-0.0.1-SNAPSHOT.jar

# 增加容器內中⽂支援。
ENV LANG="en_US.UTF-8"

# 增強Webshell使⽤體驗。
ENV TERM=xterm

# 將啟動命令寫入啟動指令碼start.sh。
RUN mkdir -p /home/admin
RUN echo 'eval execjava -jar $CATALINA_OPTS /home/admin/app/hello-edas-0.0.1-SNAPSHOT.jar'> /home/admin/start.sh && chmod +x /home/admin/start.sh
WORKDIR $ADMIN_HOME
CMD ["/bin/bash", "/home/admin/start.sh"]            
說明
  • 如果您需要使用微服務能力,則在設定啟動命令時,需添加$CATALINA_OPTS啟動參數。具體操作,請參見設定啟動命令

  • 如果您需要使用自建的註冊中心或MSE的註冊中心,則需配置啟動參數-Dnacos.use.endpoint.parsing.rule=false-Dnacos.use.cloud.namespace.parsing=false參數需要放在-jar之前,否則可能會導致無法使用非SAE內建的註冊中心。其他具體詳情,請參見使用自建Nacos服務註冊中心使用MSE的Nacos註冊中心

Spring Cloud或Dubbo應用的Dockerfile樣本(基於WAR包)

FROM centos:7
LABEL maintainer="SAE R&D team"

# 安裝打包必備軟體。
RUN yum -y install wget unzip telnet

# 準備JDK以及Tomcat系統變數。
ENV JAVA_HOME /usr/java/latest
ENV CATALINA_HOME /home/admin/apache-tomcat-7.0.91
ENV ADMIN_HOME /home/admin
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
RUN mkdir -p /home/admin

# 下載安裝OpenJDK。
RUN yum -y install java-1.8.0-openjdk-devel

# 下載安裝Tomcat。
RUN wget http://edas-hz.oss-cn-hangzhou.aliyuncs.com/apache-tomcat-7.0.91.tar.gz -O /tmp/apache-tomcat-7.0.91.tar.gz && \
    tar -xvf /tmp/apache-tomcat-7.0.91.tar.gz -C /home/admin && \
    rm /tmp/apache-tomcat-7.0.91.tar.gz && \
    chmod +x ${CATALINA_HOME}/bin/*sh

RUN mkdir -p ${CATALINA_HOME}/deploy/

# 增加容器內中文支援。
ENV LANG="en_US.UTF-8"

# 增強Webshell使⽤體驗。
ENV TERM=xterm

# 下載部署SAE示範WAR包。
RUN wget http://sae-demo-cn-shenzhen.oss-cn-shenzhen.aliyuncs.com/demo/1.0/hello-edas.war -O /tmp/ROOT.war && \
    rm -rf ${CATALINA_HOME}/webapps/ROOT &&\
    unzip /tmp/ROOT.war -d ${CATALINA_HOME}/deploy/ROOT/ && \
    rm -rf /tmp/ROOT.war

# 設定Tomcat安裝目錄為容器啟動目錄,並採用run方式啟動Tomcat,在標準命令列輸出catalina日誌。
WORKDIR $ADMIN_HOME
CMD ["catalina.sh", "run"]            

HSF應用的Dockerfile樣本(基於JAR包)

FROM centos:7
LABEL maintainer="SAE R&D team"

# 安裝打包必備軟體。
RUN yum install -y wget unzip telnet lsof net-tools bind-utils

# 準備JDK及Tomcat系統變數與路徑。
ENV JAVA_HOME /usr/java/latest
ENV CATALINA_HOME /home/admin/taobao-tomcat
ENV PATH ${JAVA_HOME}/bin:${PATH}
ENV ADMIN_HOME /home/admin

# 設定EDAS-Container以及Pandora應用程式容器版本。
ENV EDAS_CONTAINER_VERSION V3.5.4
LABEL pandora V3.5.4

# 下載安裝OpenJDK。
RUN yum -y install java-1.8.0-openjdk-devel

# 建立JAVA_HOME軟連結。
RUN if [ ! -L "${JAVA_HOME}" ]; then mkdir -p `dirname ${JAVA_HOME}` && ln -s `readlink -f /usr/lib/jvm/java` ${JAVA_HOME}; fi

# 根據環境變數,下載安裝EDAS-Container以及Pandora應用程式容器版本。
RUN mkdir -p ${CATALINA_HOME}/deploy
RUN wget http://edas-hz.oss-cn-hangzhou.aliyuncs.com/edas-plugins/edas.sar.${EDAS_CONTAINER_VERSION}/taobao-hsf.tgz -O /tmp/taobao-hsf.tgz && \
    tar -xvf /tmp/taobao-hsf.tgz -C ${CATALINA_HOME}/deploy/ && \
    rm -rf /tmp/taobao-hsf.tgz

# 下載部署SAE示範JAR包。
RUN mkdir -p ${ADMIN_HOME}/app && wget http://edas.oss-cn-hangzhou.aliyuncs.com/demoapp/fatjar-test-case-provider-0.0.1-SNAPSHOT.jar -O ${ADMIN_HOME}/app/provider.jar

# 將啟動命令寫入啟動指令碼start.sh。
RUN echo 'eval execjava -jar $CATALINA_OPTS /home/admin/app/hello-edas-0.0.1-SNAPSHOT.jar'> /home/admin/start.sh && chmod +x /home/admin/start.sh
WORKDIR $CATALINA_HOME
CMD ["/bin/bash", "/home/admin/start.sh"]            
說明
  • 如果您需要使用微服務能力,則在設定啟動命令時,需添加$CATALINA_OPTS啟動參數。具體操作,請參見設定啟動命令

  • 如果您需要使用自建的註冊中心或MSE的註冊中心,則需配置啟動參數-Dnacos.use.endpoint.parsing.rule=false-Dnacos.use.cloud.namespace.parsing=false參數需要放在-jar之前,否則可能會導致無法使用非SAE內建的註冊中心。其他具體詳情,請參見使用自建Nacos服務註冊中心使用MSE的Nacos註冊中心

HSF應用的Dockerfile樣本(基於WAR包)

FROM centos:7
LABEL maintainer="SAE R&D team"

# 安裝打包必備軟體。
RUN yum install -y wget unzip telnet lsof net-tools bind-utils

# 準備JDK以及Tomcat系統變數與路徑。
ENV JAVA_HOME /usr/java/latest
ENV CATALINA_HOME /home/admin/taobao-tomcat
ENV PATH ${JAVA_HOME}/bin:${CATALINA_HOME}/bin:${PATH}

# 設定EDAS-Container以及Pandora應用程式容器版本。
ENV EDAS_CONTAINER_VERSION V3.5.4
LABEL pandora V3.5.4

# 下載安裝OpenJDK。
RUN yum -y install java-1.8.0-openjdk-devel

# 建立JAVA_HOME軟連結。
RUN if [ ! -L "${JAVA_HOME}" ]; then mkdir -p `dirname ${JAVA_HOME}` && ln -s `readlink -f /usr/lib/jvm/java` ${JAVA_HOME}; fi

# 下載安裝Ali-Tomcat 7.0.92到/home/admin/taobao-tomcat目錄。
RUN wget http://edas-hz.oss-cn-hangzhou.aliyuncs.com/edas-container/7.0.92/taobao-tomcat-production-7.0.92.tar.gz -O /tmp/taobao-tomcat.tar.gz && \
    mkdir -p ${CATALINA_HOME} && \
    tar -xvf /tmp/taobao-tomcat.tar.gz -C ${CATALINA_HOME} && \
    mv ${CATALINA_HOME}/taobao-tomcat-production-7.0.59.3/* ${CATALINA_HOME}/ && \
    rm -rf /tmp/taobao-tomcat.tar.gz ${CATALINA_HOME}/taobao-tomcat-production-7.0.59.3 && \
    chmod +x ${CATALINA_HOME}/bin/*sh

# 根據環境變數,下載安裝EDAS-Container以及Pandora應用程式容器版本。
RUN wget http://edas-hz.oss-cn-hangzhou.aliyuncs.com/edas-plugins/edas.sar.${EDAS_CONTAINER_VERSION}/taobao-hsf.tgz -O /tmp/taobao-hsf.tgz && \
    tar -xvf /tmp/taobao-hsf.tgz -C ${CATALINA_HOME}/deploy && \
    rm -rf /tmp/taobao-hsf.tgz

# 下載部署SAE示範WAR包。
RUN wget http://sae-demo-cn-shenzhen.oss-cn-shenzhen.aliyuncs.com/demo/hello-edas.war -O /tmp/ROOT.war && \
    unzip /tmp/ROOT.war -d ${CATALINA_HOME}/deploy/ROOT && \
    rm -rf /tmp/ROOT.war

# 設定Tomcat安裝目錄為容器啟動目錄,並採用run方式啟動Tomcat,在標準命令列輸出catalina日誌。
WORKDIR ${CATALINA_HOME}
CMD ["catalina.sh", "run"]

自訂設定Dockerfile

通過編輯Dockerfile檔案修改運行環境配置,如更換JDK版本、Tomcat修改配置和更改運行時環境等操作。

  • 更換JDK版本

    在標準Dockerfile中,請參見以下樣本更換其他版本的JDK。

    # 下載安裝JDK 8。
    RUN wget http://edas-hz.oss-cn-hangzhou.aliyuncs.com/agent/prod/files/jdk-8u65-linux-x64.rpm -O /tmp/jdk-8u65-linux-x64.rpm && \
        yum -y install /tmp/jdk-8u65-linux-x64.rpm && \
        rm -rf /tmp/jdk-8u65-linux-x64.rpm                            
  • 在Tomcat啟動參數中添加SAE運行環境

    SAE提供了JVM環境變數EDAS_CATALINA_OPTS,包含了運行所需的基本參數。此外Ali-Tomcat提供了自訂JVM參數配置選項JAVA_OPTS,可以設定Xmx、Xms等參數。

    # 設定SAE應用JVM參數。
    ENV CATALINA_OPTS ${EDAS_CATALINA_OPTS}
    # 設定JVM參數。
    ENV JAVA_OPTS="\
         -Xmx3550m \
         -Xms3550m \
         -Xmn2g"                            
  • 使用獨立註冊中心

    如果您希望在微服務應用中使用獨立的註冊中心,請在Java命令後增加以下兩個參數。

    • -Dnacos.use.endpoint.parsing.rule=false
    • -Dnacos.use.cloud.namespace.parsing=false

    範例程式碼如下:

    RUN echo 'eval exec java -Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false -jar $CATALINA_OPTS /home/admin/app/hello-edas-0.0.1-SNAPSHOT.jar'> /home/admin/start.sh && chmod +x /home/admin/start.sh

構建鏡像

從本地命令列進入Dockerfile檔案所在的目錄,執行docker build命令製作鏡像。

docker build -t <標籤名稱,最好取應用程式名稱>:<版本號碼> .
或
docker build -t <標籤名稱,最好取應用程式名稱>:<版本號碼> -f /path/to/custom_dockerfile_name.# 適用於您建立好的Dockerfile在其他位置或名稱不為Dockerfile的情境。

例如:

docker build -t hsf-provider:1.0.0 .

製作完成後,執行docker images | grep <鏡像標籤名稱>命令查看本地編譯完成的鏡像。

上傳鏡像到鏡像倉庫

您可以將本地產生的應用鏡像上傳到阿里雲提供的容器鏡像倉庫。詳細步驟,請參見管理鏡像

執行指定鏡像倉庫基本資料頁面提供的將鏡像推送到Registry相關命令,將本地鏡像上傳到該鏡像倉庫。

docker login --username=<當前登入的帳號名> registry.<regionId>.aliyuncs.com     # 輸入的密碼為阿里雲Container Registry預設執行個體訪問憑證版面設定的固定或者臨時密碼,並非阿里雲帳號密碼。
docker tag <本地應用鏡像ID> registry.<regionId>.aliyuncs.com/<命令空間名稱>/<鏡像倉庫名稱>:<鏡像版本號碼>
docker push registry.<regionId>.aliyuncs.com/<命令空間名稱>/<鏡像倉庫名稱>:<鏡像版本號碼>            

例如:

docker login --username=****@188077086902**** registry.cn-hangzhou.aliyuncs.com
docker tag <ImageId> registry.cn-hangzhou.aliyuncs.com/webapps/hsf-provider:1.0.0
docker push registry.cn-hangzhou.aliyuncs.com/webapps/hsf-provider:1.0.0            

阿里雲鏡像倉庫v2

更多資訊

鏡像製作完成後,您可以將其以鏡像的方式部署在SAE。具體操作,請參見以下文檔: