DockerFile 語法

DockerFile示例展示:

FROM adoptopenjdk/openjdk7:latest     //獲取base image
RUN mkdir /opt/app                    //類似於執行 linux指令
COPY demo-docker.jar /opt/app/        //類似於linux copy指令
EXPOSE 8080                           //對外端口
CMD ["java", "-jar", "/opt/apps/demo-docker.jar"]     //執行命令 java -jar /opt/apps/demo-docker.jar

FROM

一般是Dockfile開頭的語法,他的作用是指定我們所新創建的container的base image

 FROM scratch                       //表示我們從頭去創建container不依賴於base image
 FROM adoptopenjdk/openjdk8:latest  //表示從某個base image基礎上創建container

LABEL

給創建的鏡像添加標籤,比如作者信息,版本信息,描述信息等

LABEL maintainer = "作者姓名"
LABEL version = "版本信息"
LABEL description = "描述"

RUN

相當於執行命令,比如我們需要在鏡像中安裝一些軟件,那麼就需要使用RUN語法,但需要注意的是,由於每條RUN操作會在docker之中新建一個鏡像,所以我們儘量將一些命令合併成一條,在這裏我們可以使用反斜槓換行,使其閱讀美觀

RUN yum -y update && \
    yum install -y net-tools ntpdate && \
    mkdir -p /opt/nginx/{html,conf}

WORKDIR

類似於linux中的 cd 命令,在對目錄進行操作時,需要注意

  • 儘量使用WORKDIR 不要使用 RUN cd
  • 儘量使用絕對路徑
WORKDIR /opt/software      //如果沒有會自動創建/opt/software目錄
WORKDIR apps               //同上
RUN pwd                    //輸出內容是/opt/software/apps

ADD 和 COPY

  ADD COPY
相同功能 將某文件複製到固定目錄下 將某文件複製到固定目錄下
不通功能 可以將tar文件解壓提取到固定目錄下 單純複製文件
示例

ADD demo /opt

ADD demo.tar.gz /opt

COPY demo /opt

 

 

 

 

 

如果想添加遠程文件、目錄,可使用 RUN + curl/wget

ENV

爲當前容器設置環境變量時,可以使用ENV設置一個常量,如想安裝一個5.7的MYSQL時我們可以這樣做

ENV MYSQL_VERSION 5.7                                  //設置常量 MYSQL_VERSION值是5.7
RUN yum install -y mysql-server = "${MYSQL_VERSION}"   //引用常量

CMD 和 ENTRYPOINT

dockerfile有兩種書寫格式,cmd和entrypoint在這兩種書寫格式中輸出的結果不通

  • 第一種shell格式:
RUN yum install -y ntpdate
CMD echo "hello world"
ENTRYPOINT echo "hello world"
FROM centos7
ENV name hello-world
ENTRYPOINT echo "${name}"  //輸出是hello-world 
  • 第二種exec格式:
RUN ["yum","install","-y","ntpdate"]
CMD ["/bin/echo","hello-world"]
ENTRYPOINT ["/bin/echo","hello-world"]
FROM centos7
ENV name hello-world
ENTRYPOINT ["bin/echo","${name}"]  //輸出是${name}

兩種不同輸出的原因是因爲第一種Dockerfile是shell格式執行命令,默認就在linux的shell裏執行。第二種Dockerfile我們去執行的是 echo這個命令而不是在linux的shell下執行命令,因此輸出不一樣。

1)CMD

容器啓動時默認執行的命令,如果docker run指定了其他命令,CMD命令被忽略,例如:

FROM centos7
CMD echo "hello-world"

docker run [image] 輸出就是 hello-world

docker run [image] /bin/bash 默認進入了當前container

注:如果定義了多個CMD,只有最後一個CMD會被執行

2)ENTRYPOINT

讓容器以應用程序或者服務的形式運行

不會被忽略,一定會執行

最佳實踐是寫一個shell 腳本作爲 ENTRYPOINT

EXPOSE

功能爲暴漏容器運行時的監聽端口給外部
但是EXPOSE並不會使容器訪問主機的端口
如果想使容器與主機的端口有映射關係,必須在容器啓動的時候加上 -P 參數

VOLUME

可實現掛載功能,容器告訴Docker在主機上創建一個目錄(默認情況下是在/var/lib/docker),然後將其掛載到指定的路徑。
當刪除使用該Volume的容器時,Volume中的內容本身不會受到影響,它可以一直存在下去

FROM centos7    //將該鏡像的存儲內容掛載到宿主機data文件夾下,這樣即使刪除了該鏡像,再重新創建後,也不會影響數據
VOLUME /data
CMD echo "hello-world"

Dockerfile更多語法請參考docker doc文檔

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章