1. 程式人生 > >使用Dockerfile建立簡單java應用映象

使用Dockerfile建立簡單java應用映象

利用Dockerfile構建一個簡單的java應用映象,依賴環境比較簡單,JDK,定製化的Tomcat(名為star-appserver) 1、環境準備     ubuntu:14.04     docker : 1.4     jdk:jdk-8u31-linux-x64.gz     tomcat : 7.0(star-appserver)     在/usr/local下建立目錄:sms,將jdk-8u31-linux-x64.gz和star-appserver(此處為了簡單,已包含應用)拷貝到此目錄下,由於Docker在構建映象時,需將Dockerfile所在目錄傳給Docker daemon作為構建上下文,所以此目錄下應包含構建時所依賴的各種環境。
2、環境準備好後,在sms下建立Dockerfile(名字必須為Dockerfile)檔案,內容如下
FROM ubuntu:latest MAINTAINER zhangjy #install JDK and TOMCAT ADD jdk-8u31-linux-x64.gz  /usr/local/ ADD tomcat /usr/local/     #tomcat下為star-appserver,如果直接複製star-appserver,只會複製目錄裡邊的內容,不會複製目錄本身 ADD timezone /etc/
#啟動指令碼,用於從映象啟動容器時呼叫執行,見下面的ENTRYPOINT
ADD onStart.sh /usr/local/ ENV JAVA_HOME=/usr/local/jdk1.8.0_31 CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar PATH=$PATH:$JAVA_HOME/bin RUN echo "JAVA_HOME=/usr/local/jdk1.8.0_31\nCALSSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar\nPATH=$PATH:$JAVA_HOME/bin" >> /etc/profile #start tomcat ENTRYPOINT ["/usr/local/onStart.sh"]
3、在sms下建立onStart.sh,並賦予執行許可權,用於啟動tomcat並輸出日誌(為了保證容器中有執行狀態的程序,否則容器停止)     #!/bin/bash     /usr/local/star-appserver/bin/startup.sh     tail -f /usr/local/star-appserver/logs/stariboss.log 4、在sms下執行命令,建立成功        $docker build -t zhangjy/starsms:v1 . 啟動時,發現應用訪問資料庫報錯:ORA-01882: timezone region  not found,原因是JVM預設使用Ubuntu的/etc/timezone裡配置的時區,檢視timezone時區為Etc/UTC,再檢視ORACLE資料庫支援的時區:select * from V$TIMEZONE_NAMES發現沒有,於是又在sms目錄下建立了一個timezone檔案,將時區配置成Asia/Shanghai,在Dockerfile中加入到映象/etc/目錄下 Dockerfile檔案配置說明: FROM     表明基於哪個映象建立 MAINTAINER     作者和郵箱 ADD     將目錄或檔案加入到映象的某個目錄,格式是ADD <原始檔> <目標目錄> RUN     有兩種格式:
  • RUN <command> (the command is run in a shell - /bin/sh -c - shell form)
  • RUN ["executable", "param1", "param2"] (exec form)
    預設RUN後的命令是在/bin/sh下執行,像Ubuntu預設/bin/sh是指向/bin/dash,如果想使用/bin/bash,則可按如下方式         RUN ["/bin/bash","-c","source /etc/profile"]     但需注意,這種方式不能解析類似於$HOME的引數引用 ENV     設定環境變數,在映象構建過程中和容器啟動後均有效 CMD

    CMD在容器執行的時候提供一些命令及引數,用法如下:

  • CMD ["executable","param1","param2"] (exec form, this is the preferred form) 
  • CMD ["param1","param2"] (as default parameters to ENTRYPOINT) 
  • CMD command param1 param2 (shell form) 
    - 第一種用法:執行一個可執行的檔案並提供引數。     - 第二種用法:為ENTRYPOINT指定引數,即為ENTRYPOINT指定命令的預設引數,通過docker run命令傳過來的引數會將其覆蓋     - 第三種用法(shell form):是以”/bin/sh -c”的方法執行的命令。

    如指定:

    1. CMD [“/bin/echo”, “this is a echo test ”] 

    build後執行(假設映象名為ec):

    1. docker run ec 

    就會輸出: this is a echo test

注意:如果在docker run命令後指定命令,如docker run ec echo 'test',會將CMD的命令覆蓋。CMD的命令不能接收run傳過來的引數,而ENTRYPOINT可以 ENTRYPOINT     有兩種用法
  • ENTRYPOINT ["executable", "param1", "param2"] (the preferred exec form)
  • ENTRYPOINT command param1 param2 (shell form)
    第一種可以接收docker run命令傳過來的引數(即使docker run傳過來的是命令,也會被當做引數處理),如果想覆蓋,可使用docker run ... --entrypoint <COMMAND>