arxiv論文提交流程
Dockerfile
格式:
FROM centos:latest #依賴的基礎映象
MAINTAINER fage #製作檔案的人
RUN yum install -y gcc #安裝的軟體
COPY run.sh /usr/bin #執行指令
EXPOSE 80 #宣告使用的埠
CMD [ “run.sh”] #構建的時候執行的指令
命令是順序往下執行的
Dockerfile指令:
指令 | 描述 |
FROM | 指定映象的基礎映象; |
MAINTAINER | 指定維護者資訊; |
RUN | 執行命令; |
LABEL | 指定生成映象的元資料標籤資訊; |
EXPOSE | 宣告映象內服務所監聽的埠; |
ENV | 指定環境變數; |
ADD | 賦值指定的路徑下的內容到容器中的路徑下,可以為URL;如果為tar檔案,會自動解壓到路徑下 |
COPY | 賦值本地主機的路徑下的內容到容器中的路徑下;一般情況下推薦使用COPY而不是ADD; |
ENTRYPOINT | 指定映象的預設入口; |
VOLUME | 建立資料掛載點; |
USER | 指定執行容器時的使用者名稱或UID; |
WORKDIR | 配置工作目錄; |
ARG | 指定映象內使用的引數(例如版本號資訊等); |
ONBUILD | 配置當前所建立的映象作為其他映象的基礎映象時,所執行的建立操作的命令; |
STOPSIGNAL | 容器退出的訊號; |
HEALTHCHECK | 如何進行健康檢查; |
SHELL | 指定使用SHELL時的預設SHELL型別; |
CMD | 指定啟動容器時預設執行的命令 |
編寫 Dockerfile 案例
Docker通過Dockerfile自動構建映象的文字檔案,由一條一條的指令組成。
這裡,提供了4點編寫建議,可幫助你編寫高效易用的Dockerfile。
1.減少映象層
一次RUN指令形成新的一層,儘量shell命令都寫在一起,減少映象層。
例如:
FROM centos:7 MAINTAIENR fengyuanfei RUN yum install-y gcc-c++ make RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz RUN tar xf php-5.6.36.tar.gz RUN cd php-5.6.36 RUN ./configure --prefix=/usr/local/php RUN make -j 4 RUN make install EXPOSE 9000 CMD ["php-fpm"]
應該寫成
FROM centos:7 MAINTAINER www.ctnrs.com RUN yum install epel-release -y && \ yum install -y gcc gcc-c++ make RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && \ tar zxf php-5.6.36.tar.gz && \ cd php-5.6.36 && \ ./configure --prefix=/usr/local/php && \ make -j 4 && make install EXPOSE 9000 CMD ["php-fpm"]
2.優化映象大小:清理無用資料
一次RUN形成的一層,如果沒有在同一層刪除,無論是否最後刪除,都會帶到清理對應的殘留資料,減少映象大小。
FROM centos:7 MAINTAINER www.ctnrs.com RUN yum install epel-release -y && \ yum install -y gcc gcc-c++ make gd-devel libxml2-devel \ libcurl-devel libjpeg-devel libpng-devel openssl-devel \ libmcrypt-devel libxslt-devel libtidy-devel autoconf \ iproute net-tools telnet wget curl && \ yum clean all && \ rm -rf /var/cache/yum/* RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && \ tar zxf php-5.6.36.tar.gz && \ cd php-5.6.36 && \ ./configure --prefix=/usr/local/php \ make -j 4 && make install && \ cd / && rm -rf php*
3. 減少網路傳輸時間
最好在內部有一個存放軟體包的地方,類似於上述的PHP官方下載地址:http://docs.php.net/distributions/php-5.6.36.tar.gz,如果用到maven構建這樣的操作,同時也更改為私有maven倉庫,減少網路傳輸時間,提高映象構建速度。
4. 多階段進行映象構建
如果執行一個專案,根據咱們上面的做法,是直接把程式碼拷貝到基礎映象裡,如果是一個需要預先程式碼編譯的專案呢?例如JAVA語言,如何程式碼編譯、部署在一起完成呢!
上面做法需要事先在一個Dockerfile構建一個基礎映象,包括專案執行時環境及依賴庫,再寫一個Dockerfile將專案拷貝到執行環境中,有點略顯複雜了。
像JAVA這類語言如果程式碼編譯是在Dockerfile裡操作,還需要把原始碼構建進去,但實際執行時只需要構建出的包,這種把原始碼放進去有一定安全風險,並且也增加了映象體積。
為了解決上述問題,Docker 17.05開始支援多階段構建(multi-stage builds),可以簡化Dockerfile,減少映象大小。
例如,構建JAVA專案映象:
# git clone https://github.com/lizhenliang/tomcat-java-demo # cd tomcat-java-demo # vi Dockerfile FROM maven AS build ADD ./pom.xml pom.xml ADD ./src src/ RUN mvn clean package FROM lizhenliang/tomcat RUN rm -rf /usr/local/tomcat/webapps/ROOT COPY --from=build target/*.war /usr/local/tomcat/webapps/ROOT.war # docker build -t demo:v1 . # docker container run -d -v demo:v1
首先,第一個FROM 後邊多了個 AS 關鍵字,可以給這個階段起個名字。
然後,第二部分FROM用的我們上面構建的Tomcat映象,COPY關鍵字增加了—from引數,用於拷貝某個階段的檔案到當前階段。這樣一個Dockerfile就都搞定了。
小結:映象小有很多好處,例如快速部署、快速回滾。減少服務中斷時間,同時映象倉庫佔用磁碟空間也少了。