1. 程式人生 > >Dockerfile常用指令記錄

Dockerfile常用指令記錄

Dockerfile常用指令

FROM

FROM centos:latest

MAINTAINER

指定維護者資訊

MAINTAINER "changhf"<chang_hf@163.com>

COPY

複製本地主機的 src到容器中的 dest ,src必須在上下文中,一般情況下,將本地主機的一個包含Dockerfile的目錄中的所有內容作為上下文,如docker/install。當使用本地目錄為源目錄時,推薦使用 COPY 。

COPY docker/install /install

ADD

ADD jdk-8u91-linux-x64.tar
.gz /opt

與 COPY 類似,從上下文複製檔案到映象, 宿主機路徑可以是Dockerfile所在目錄的一個相對路徑,第二個引數必須是絕對路徑,如果是壓縮檔案會被解壓提取。

RUN

RUN ln -s /opt/jdk1.8.0_91 /opt/jdk
RUN /bin/bash /install/build.sh cms
RUN /bin/bash /install/downLib.sh
RUN /bin/bash /install/container_setting.sh

當命令較長時可以使用 \ 來換行。
每條 RUN 指令將在當前映象基礎上執行指定命令,並提交為新的映象。經驗告訴我們,多條命令可以使用 \ 來合併成一條,這樣將減小所構建的映象的體積,原因是在映象中每執行一條命令都會產生一箇中間映象,我們需要儘可能的減少中間映象。
另一種寫法:

RUN["/bin/bash", "-c", "echo hello"] 

CMD

支援三種格式

CMD[“executable”,”param1”,”param2”] 使用 exec 執行,推薦方式;

CMD command param1 param2 在 /bin/sh 中執行,提供給需要互動的應用;

CMD [“param1”,”param2”] 提供給 ENTRYPOINT 的預設引數;

CMD /opt/jdk/bin/java -version

每個Dockerfile最多隻能有一條 CMD 命令。如果指定了多條命令,只有最後一條會被執行。如果使用者啟動容器通過dcoker run

命令,將會覆蓋掉 CMD 指定的命令。
Dockerfile中還有一個與CMD指令功能類似的ENTRYPOINT指令,只是後者所執行的指令不能被docker run命令覆蓋。

docker run -i -t changhf/centosWithJava /bin/bash //覆蓋CMD中的命令 執行/bin/bash

ENV

指定一個環境變數,會被後續 RUN 指令使用,並在容器執行時保持。

ENV JAVA_HOME /opt/jdk1.8.0_91/java/bin

WORKDIR

設定進入容器時的工作目錄。
可以使用多個 WORKDIR 指令,後面引數是相對路徑,基於前面命令指定的路徑。

WORKDIR /home
WORKDIR admin
RUN pwd
則最終路徑為 /home/admin

EXPOSE

指定Docker容器暴露的埠號,用於埠對映。容器內部只需對外暴露相應的埠,並對映到宿主機的埠上,外界就能隨時訪問容器內部的應用程式。這也正式Docker的強項:使用容器技術封裝應用程式,讓外界無需關注應用程式的執行環境。

docker run -d -p 50000:5000 -v ~/docker-registry:/tmp/registry registry

-p表示對容器中應用程式暴露的埠進行埠對映,左邊的50000為宿主機的埠,5000為容器內部需要暴露的埠。執行該命令表示啟動一個Docker Registry,可以通過127.0.0.1:50000檢視是否啟動成功。

EXPOSE 80

VOLUME

格式為 VOLUME [“/data”] 。設定可被掛載的資料卷。
建立一個可以從掛載宿主機檔案或目錄到容器的掛載點,一般用來存放資料庫和需要保持的資料等。通過 VOLUME 指令建立的掛載點,無法指定主機上對應的目錄,是自動生成的。

通過命令方式啟動一個容器

docker run --name data -it -v /opt/data  --privileged=true docker.io/ubuntu /bin/bash

目錄對映
-v後面的對映關係是宿主機路徑:容器路徑,可以理解為目錄對映,這樣就可以讓所有的容器共享宿主機資料,從而只需要改變宿主機的資料來源就能夠影響到所有的容器資料。宿主機上的檔案/目錄是要提前存在的,容器裡對應的檔案/目錄會自動建立。

資料卷許可權:
–privileged=true用於開放許可權,有時對映的容器路徑無法訪問,只需啟動時加上該設定即可。
參考:Dockerfile 常用指令
資料卷的使用