Dockerfile 第4關:ENV、EXPOSE、WORKDIR、ARG指令

花米徐發表於2017-11-24

Dockerfile    第4關:ENV、EXPOSE、WORKDIR、ARG指令

任務描述

本關的任務是學習ENV、EXPOSE、WORKDIR、ARG四個指令,要求學習者參照示例,使用Dockerfile構建一個名為testimage:v1的映象,Dockerfile的內容為:以busybox:latest作為基礎映象,宣告暴露3000埠。將變數var1="test"設定為環境變數,同時設定工作目錄為/tmp,在工作目錄下建立一個1.txt檔案。

相關知識

這一關我們繼續介紹Dockerfile的指令,本關將介紹ENVEXPOSEWORKDIRARG

WORKDIR指令

●WORKDIR為其他指令設定工作目錄
格式:
WORKDIR <工作目錄路徑>

WORKDIR指令為Dockerfile中的任何RUNCMDENTRYPOINTCOPYADD指令設定工作目錄(或稱當前目錄)。(也就是說以後各層的當前目錄就被改為WORKDIR指定的目錄)如果WORKDIR對應的目錄不存在,將會自動被建立。

ENV指令

●ENV 設定環境變數
格式: 
ENV <key> <value>ENV <key>=<value>

這個指令很簡單,就是設定環境變數而已,無論是後面的其它指令,還是執行時的應用,都可以直接使用這裡定義的環境變數。如下所示,下面是為tomcat設定環境變數並讓tomcat自啟動的一個Dockerfile片段。ENV設定的環境變數CATALINA_HOME能夠被後續定義指令使用。

  1. ENV CATALINA_HOME /var/tmp/apache-tomcat-8.0.45
  2. ENV PATH $PATH: $CATALINA_HOME/bin
  3. ENTRYPOINT $CATALINA_HOME /bin/startup.sh && /bin/bash

    ARG指令

    ●ARG 構建引數
    格式: 
    ARG <引數名>[=<預設值>]

    ARGENV有些類似,它們都可以被後面的其它指令直接使用,但是它並不是環境變數,這意味著將來容器執行時是不會存在ARG變數的。

    Dockerfile 中的ARG指令是定義引數名稱,以及定義其預設值。該預設值可以在構建命令docker build 中用 --build-arg <引數名>=<> 來覆蓋。

    什麼時候用ARG,什麼時候用ENV?
    如果想儲存為環境變數,就用
    ENV;如果只想在Dockerfile中臨時使用,就用ARG

    EXPOSE指令

    ●EXPOSE 暴露埠
    格式:
    EXPOSE <1> [<2>...]

    EXPOSE指令是宣告執行時容器提供服務埠,這只是一個宣告,在執行時並不會因為這個宣告應用就會開啟這個埠的服務。如果想要公開容器的埠,必須在docker run是指定-p引數去公開埠或者指定-P引數公開所有被EXPOSE的埠。具體可以參照https://docs.docker.com/engine/reference/run/#expose-incoming-ports

    在 Dockerfile 中寫入這樣的宣告有兩個好處,一個是幫助映象使用者理解這個映象服務的守護埠,以方便配置對映;另一個用處則是在執行時使用隨機埠對映時,也就是 docker run -P時,會自動隨機對映EXPOSE 的埠。

    例項:使用Dockerfile,建立一個擁有java和tomcat執行環境的映象。

    Dockerfile的內容如下,首先使用FROM指定基礎映象為ubuntu:latest映象。然後使用WORKDIR設定當前的工作目錄為/var/tmp。接下來使用RUN命令將jre.tar.gz下載到工作目錄,並解壓檔案,然後刪除jre.tar.gz;然後用類似的方式處理tomcat

    接下來使用ENV配置javatomcat的環境變數,由於tomcat服務會預設監聽8080埠,所以使用EXPOSE暴露埠號。最後使用ENTRYPOINT設定啟動命令,使tomcat服務隨容器啟動而啟動。

  4. FROM ubuntu
  5. WORKDIR /var/tmp
  6.  
  7. RUN apt-get update && \
  8. apt-get install -y wget && \
  9. wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b721c7dfaa008135/jre-8u144-linux-x64.tar.gz && \
  10. tar -xzf jre-8u144-linux-x64.tar.gz && \
  11. rm jre-8u144-linux-x64.tar.gz
  12.  
  13. RUN wget "http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.0.45/bin/apache-tomcat-8.0.45.tar.gz" && \
  14. tar -xzf apache-tomcat-8.0.45.tar.gz && \
  15. rm apache-tomcat-8.0.45.tar.gz
  16.  
  17. ENV JAVA_HOME /var/tmp/jre1.8.0_144
  18. ENV CATALINA_HOME /var/tmp/apache-tomcat-8.0.45
  19. ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
  20.  
  21. EXPOSE 8080
  22.  
  23. ENTRYPOINT /var/tmp/apache-tomcat-8.0.45/bin/startup.sh && /bin/bash

    任務要求

    本關的程式設計任務是補全step4/dockerfile4.sh檔案中的內容,要求使用Dockerfile構建一個名為testimage:v1的映象,具體要求如下:

  • 補全Dockerfile檔案,該Dockerfile的內容如下:
  • 以busybox:latest作為基礎映象,
  • 宣告暴露3000埠
  • 將變數var1="test"設定為環境變數
  • 設定工作目錄為/tmp,在工作目錄下建立一個1.txt檔案。
  • 基於該Dockerfile檔案,構建一個名為testimage:v1的映象

    #建立一個空資料夾,並進入其中

    mkdir newdir4

    cd newdir4

    #建立一個Dockerfile檔案

    touch Dockerfile

    #假設我的Dockerfile檔案為

    #FROM ubuntu

    #RUN mkdir dir1

    #可以這麼寫:

    # echo 'FROM ubuntu' > Dockerfile

    # echo 'RUN mkdir dir1'>> Dockerfile

    #輸入Dockerfile檔案內容

    #********** Begin *********#

    #以busybox為基礎映象

    echo 'FROM busybox:latest' > Dockerfile

    #宣告暴露3000埠

    echo 'EXPOSE 3000'>> Dockerfile

    #將變數var1=test設定為環境變數

    echo 'ENV var1=test' >> Dockerfile

    #設定工作目錄為/tmp

    echo 'WORKDIR /tmp' >> Dockerfile

    #在工作目錄下建立一個1.txt檔案

    echo "RUN touch 1.txt" >> Dockerfile

    #********** End **********#

    #檔案內容完畢,在當前資料夾中執行

    #********** Begin *********#

    #以該Dockerfile構建一個名為testimage:v1的映象

    docker build -t testimage:v1 .

     

    #********** End **********#

相關文章