使用Dockerfile建立簡單java應用映象
阿新 • • 發佈:2018-12-26
利用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/
#啟動指令碼,用於從映象啟動容器時呼叫執行,見下面的ENTRYPOINT3、在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 有兩種格式: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"]
RUN <command>
(the command is run in a shell -/bin/sh -c
- shell form)RUN ["executable", "param1", "param2"]
(exec form)
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)
如指定:
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)