Dockerfile 第4關:ENV、EXPOSE、WORKDIR、ARG指令
Dockerfile 第4關:ENV、EXPOSE、WORKDIR、ARG指令
任務描述
本關的任務是學習ENV、EXPOSE、WORKDIR、ARG四個指令,要求學習者參照示例,使用Dockerfile構建一個名為testimage:v1的映象,Dockerfile的內容為:以busybox:latest作為基礎映象,宣告暴露3000埠。將變數var1="test"設定為環境變數,同時設定工作目錄為/tmp,在工作目錄下建立一個1.txt檔案。
這一關我們繼續介紹Dockerfile的指令,本關將介紹ENV、EXPOSE、WORKDIR、ARG。
●WORKDIR為其他指令設定工作目錄
格式:WORKDIR <工作目錄路徑>
WORKDIR指令為Dockerfile中的任何RUN,CMD,ENTRYPOINT,COPY和ADD指令設定工作目錄(或稱當前目錄)。(也就是說以後各層的當前目錄就被改為WORKDIR指定的目錄)如果WORKDIR對應的目錄不存在,將會自動被建立。
●ENV 設定環境變數
格式: ENV <key> <value>或ENV <key>=<value>
這個指令很簡單,就是設定環境變數而已,無論是後面的其它指令,還是執行時的應用,都可以直接使用這裡定義的環境變數。如下所示,下面是為tomcat設定環境變數並讓tomcat自啟動的一個Dockerfile片段。ENV設定的環境變數CATALINA_HOME能夠被後續定義指令使用。
- ENV CATALINA_HOME /var/tmp/apache-tomcat-8.0.45
- ENV PATH $PATH: $CATALINA_HOME/bin
- ENTRYPOINT $CATALINA_HOME /bin/startup.sh && /bin/bash
●ARG 構建引數
格式: ARG <引數名>[=<預設值>]ARG與ENV有些類似,它們都可以被後面的其它指令直接使用,但是它並不是環境變數,這意味著將來容器執行時是不會存在ARG變數的。
Dockerfile 中的ARG指令是定義引數名稱,以及定義其預設值。該預設值可以在構建命令docker build 中用 --build-arg <引數名>=<值> 來覆蓋。
什麼時候用ARG,什麼時候用ENV?
如果想儲存為環境變數,就用ENV;如果只想在Dockerfile中臨時使用,就用ARG。●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配置java與tomcat的環境變數,由於tomcat服務會預設監聽8080埠,所以使用EXPOSE暴露埠號。最後使用ENTRYPOINT設定啟動命令,使tomcat服務隨容器啟動而啟動。
- FROM ubuntu
- WORKDIR /var/tmp
- RUN apt-get update && \
- apt-get install -y wget && \
- 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 && \
- tar -xzf jre-8u144-linux-x64.tar.gz && \
- rm jre-8u144-linux-x64.tar.gz
- RUN wget "http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.0.45/bin/apache-tomcat-8.0.45.tar.gz" && \
- tar -xzf apache-tomcat-8.0.45.tar.gz && \
- rm apache-tomcat-8.0.45.tar.gz
- ENV JAVA_HOME /var/tmp/jre1.8.0_144
- ENV CATALINA_HOME /var/tmp/apache-tomcat-8.0.45
- ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
- EXPOSE 8080
- 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 **********#
相關文章
- Dockerfile小記之ARG和ENVDocker
- Docker的ARG、ENV和.env配置完整指南Docker
- Dockerfile常用指令Docker
- Docker的Dockerfile指令Docker
- Dockerfile指令詳解Docker
- Linux雲端計算教程全套影片合集:WORKDIR 指令講解Linux
- Dockerfile中指令詳解Docker
- Dockerfile---指令碼自動化Docker指令碼
- tryhackme-Expose(暴露)
- python challenge 解題 第4關Python
- 第4關-精華筆記筆記
- Docker(4):Dockerfile命令一覽Docker
- Docker - 02 建立映象 Dockerfile 指令速查表Docker
- 解讀三組容易混淆的Dockerfile指令Docker
- [20210325]SCHEDULER$_PROGRAM_ARG SCHEDULER$_JOB_ARG在哪裡.txt
- 製作一個小成本 ARG — ARG 的前世今生(二)
- 掌握 Vue3 中的 exposeVue
- laravel5.8 如何修改.env路徑?如修改./.env為./env/product.envLaravel
- Dockerfile裡的VOLUMES關鍵字Docker
- Hadoop權威指南 第4章 關於YARNHadoopYarn
- sqli-labs第3-4關 詳解SQL
- ollydbg中[local.1]、[local.2]、[arg.1]、[arg.2]的含義
- [Bash] env
- env config
- 指令Angular 4 - DirectivesAngular
- AngularJS 4(三)【指令】AngularJS
- 【Qt 專欄】QString::arg()函式QT函式
- Dockerfile指令與Docker-compose容器編排-搭建docker私有倉庫Docker
- [譯]關於NODE_ENV,哪些你應該瞭解
- Docker 入門系列四:Dockerfile-關鍵字Docker
- 理解webpack之process.env.NODE_ENV詳解(十八)Web
- 4.v-once指令
- 第4課 SVN
- 《HelloTester》第4期
- DockerfileDocker
- 關於tee指令
- 第2關
- 第216天:Angular—自定義指令(二)Angular
- [20180308]測試ARG_MAX引數.txt