Dockerfile參數簡介


 

Dockerfile參數簡介:https://docs.docker.com/engine/reference/builder/

指令                     含義解釋

FROM :              FROM debian:stretch表示以debian:stretch作為基礎鏡像進行構建

MAINTAINER:   維護者信息
RUN :                可以看出RUN后面跟的其實就是一些shell命令,通過&&將這些腳本連接在了一行執行,這么做的原因是為了減少鏡像的層數,每多一行RUN都會給鏡像增加一層,所以這里選擇將所有命令聯結在一起執行以減少層數
ARG :                特地將這個指令放在RUN之后講解,這個指令可以進行一些宏定義,比如我定義ENV JAVA_HOME=/opt/jdk,之后RUN后面的shell命令中的${JAVA_HOME}都會被/opt/jdk代替
ENV :                 可以看出這個指令的作用是在shell中設置一些環境變量(其實就是export)
FROM…AS…:  這是Docker 17.05及以上版本新出來的指令,其實就是給這個階段的鏡像起個別名:FROM ...(基礎鏡像) AS ...(別名),在后面引用這個階段的鏡像時直接使用別名就可以了

COPY:              顧名思義,就是用來來回復制文件的,COPY . /root/workspace/agent表示將當前文件夾(.表示當前文件夾,即Dockerfile所在文件夾)的所以文件拷貝到容器的/root/workspace/agent文件夾中。通過--from參數也可以從前面階段的鏡像中拷貝文件過來,比                               如--from=builder表示文件來源不是本地文件系統,而是之前的別名為builder的容器

WORKDIR:       在執行RUN后面的shell命令前會先cdWORKDIR后面的目錄

ENTRYPOINT:  這個參數表示鏡像的“入口”,鏡像打包完成之后,使用docker run命令運行這個鏡像時,其實就是執行這個ENTRYPOINT后面的可執行文件(一般是一個shell腳本文件),也可以通過["可執行文件", "參數1", "參數2"]這種方式來賦予可執行文件的執行參數,                               這個“入口”執行的工作目錄也是WORKDIR后面的那個目錄

 

各命令詳解

FROM

指定哪種鏡像作為新鏡像的基礎鏡像,如:

FROM ubuntu:14.04

MAINTAINER

指明該鏡像的作者和其電子郵件,如:

MAINTAINER vector4wang "xxxxxxx@qq.com"

LABEL

給鏡像添加信息。使用docker inspect可查看鏡像的相關信息

LABEL maintainer="394498036@qq.com"
LABEL version="1.0"
LABEL description="This is description \
歡迎關注:編程坑太多,我在等你."

 

RUN

在新鏡像內部執行的命令,比如安裝一些軟件、配置一些基礎環境,可使用\來換行,如:

RUN echo 'hello docker!' \
    > /usr/local/file.txt

 

也可以使用exec格式RUN ["executable", "param1", "param2"]的命令,如:

RUN ["apt-get","install","-y","nginx"]

要注意的是,executable是命令,后面的param是參數

COPY

將主機的文件復制到鏡像內,如果目的位置不存在,Docker會自動創建所有需要的目錄結構,但是它只是單純的復制,並不會去做文件提取和解壓工作。如:

COPY application.yml /etc/springboot/hello-service/src/resources

 

注意:需要復制的目錄一定要放在Dockerfile文件的同級目錄下
原因:

因為構建環境將會上傳到Docker守護進程,而復制是在Docker守護進程中進行的。任何位於構建環境之外的東西都是不可用的。COPY指令的目的的位置則必須是容器內部的一個絕對路徑。
---《THE DOCKER BOOK》

ADD

將主機的文件復制到鏡像中,跟COPY一樣,限制條件和使用方式都一樣,如:

ADD application.yml /etc/springboot/hello-service/src/resources

 

但是ADD會對壓縮文件(tar, gzip, bzip2, etc)做提取和解壓操作。

EXPOSE

暴露鏡像的端口供主機做映射,啟動鏡像時,使用-P參數來講鏡像端口與宿主機的隨機端口做映射。使用方式(可指定多個):

EXPOSE 8080 
EXPOSE 8081
...

 

WORKDIR

在構建鏡像時,指定鏡像的工作目錄,之后的命令都是基於此工作目錄,如果不存在,則會創建目錄。如

WORKDIR /usr/local
WORKDIR webservice
RUN echo 'hello docker' > text.txt
...

 

最終會在/usr/local/webservice/目錄下生成text.txt文件

ONBUILD

當一個包含ONBUILD命令的鏡像被用作其他鏡像的基礎鏡像時(比如用戶的鏡像需要從某為准備好的位置添加源代碼,或者用戶需要執行特定於構建鏡像的環境的構建腳本),該命令就會執行。
如創建鏡像image-A

FROM ubuntu
...
ONBUILD ADD . /var/www
...

 

然后創建鏡像image-B,指定image-A為基礎鏡像,如

FROM image-A
...

 

然后在構建image-B的時候,日志上顯示如下:

Step 0 : FROM image-A
# Execting 1 build triggers
Step onbuild-0 : ADD . /var/www
...

 

USER

指定該鏡像以什么樣的用戶去執行,如:

USER mongo

 

VOLUME

用來向基於鏡像創建的容器添加卷。比如你可以將mongodb鏡像中存儲數據的data文件指定為主機的某個文件。(容器內部建議不要存儲任何數據)
如:

VOLUME /data/db /data/configdb

 

注意:VOLUME 主機目錄 容器目錄

CMD

容器啟動時需要執行的命令,如:

CMD /bin/bash

 

同樣可以使用exec語法,如

CMD ["/bin/bash"]

 

當有多個CMD的時候,只有最后一個生效。

ENTRYPOINT

作用和用法和CMD一模一樣

CMD和ENTRYPOINT的區別

敲黑板!!!非常重要
一定要注意!

一定要注意!

一定要注意!
CMD和ENTRYPOINT同樣作為容器啟動時執行的命令,區別有以下幾點:

  • CMD的命令會被 docker run 的命令覆蓋而ENTRYPOINT不會

如使用CMD ["/bin/bash"]ENTRYPOINT ["/bin/bash"]后,再使用docker run -ti image啟動容器,它會自動進入容器內部的交互終端,如同使用
docker run -ti image /bin/bash

但是如果啟動鏡像的命令為docker run -ti image /bin/ps,使用CMD后面的命令就會被覆蓋轉而執行bin/ps命令,而ENTRYPOINT的則不會,而是會把docker run 后面的命令當做ENTRYPOINT執行命令的參數
以下例子比較容易理解
Dockerfile中為

...
ENTRYPOINT ["/user/sbin/nginx"]

 

然后通過啟動build之后的容器

docker run -ti image -g "daemon off"

 

此時-g "daemon off"會被當成參數傳遞給ENTRYPOINT,最終的命令變成了

/user/sbin/nginx -g "daemon off"

 

  • CMD和ENTRYPOINT都存在時

CMD和ENTRYPOINT都存在時,CMD的指令變成了ENTRYPOINT的參數,並且此CMD提供的參數會被 docker run 后面的命令覆蓋,如:

...
ENTRYPOINT ["echo","hello","i am"]
CMD ["docker"]

 

之后啟動構建之后的容器

  • 使用docker run -ti image

    輸出“hello i am docker”

  • 使用docker run -ti image world

    輸出“hello i am world”

指令比較多,可以通過分類(如開頭的表格)的辦法去記憶

示例

自己寫了個簡單的示例,非常簡單

FROM ubuntu
MAINTAINER vector4wang xxxx@qq.com

WORKDIR /usr/local/docker
ADD temp.zip ./add/
COPY temp.zip ./copy/
EXPOSE 22
RUN groupadd -r vector4wang && useradd -r -g vector4wang vector4wang
USER vector4wang

ENTRYPOINT ["/bin/bash"]

 

下面是運行過程

1.png

 
2.png

(動態圖太大了上傳不了)

注意 登錄之后的用戶名和ADD、COPY進去的文件

后記

以上只是自己通過看書寫demo和瀏覽其他人的博文所總結出來的,之后在實戰的過程中會把遇到的一些實際問題追加進來。


鏈接:https://www.jianshu.com/p/10ed530766af

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM