DockerFlie官網檔案: https://docs.docker.com/engine/reference/builder/
DockerFile中文: http://www.dockerinfo.net/document
Docker 倉庫地址: https://github.com/docker-library/docs可以借鑒參考寫
RUN EXEC
- exec 是當前命令執行(執行完會kill當前終端)
- run shell是子行程運行(/bin/shell -c echo hello)
CMD ENTRYOINT
- 在容器run的時候 默認啟動的命令 容器默認是 /bin/bash
- CMD 是主行程啟動,是會被覆寫的
- ENTRYOINT 子行程啟動,不會被覆寫
- CMD ["executable","param1","param2"] 默認用這個
- CMD ["param1","param2"] 給ENTRYPOINT的引數
- CMD command param1 param2
LABEL MAINTAINER
- LABEL 說明性資料
- MANINTAINER 被LABEL取締
EXPOSE
- 設定暴露埠,
- EXPOSE 6379 … …
ENV ARG
- 環境變數
- ENV 設定執行命令時候的環境變數,構建完成,還有效
- ARG 執行命令時的環境變數,構建完成后 無效 docker build --build-arg user=what_user 可以給定義的arg傳入值(比如用戶名和密碼,手動傳入)
COPY ADD
- 宿主機目錄檔案拷貝到容器
- COPY 拷貝檔案
- ADD 自動解壓檔案
2、指令
指令的一般格式為 INSTRUCTION arguments,指令包括 FROM、MAINTAINER、RUN 等,
2.1 FROM
格式為 FROM <image>或FROM <image>:<tag>,
第一條指令必須為 FROM 指令,并且,如果在同一個Dockerfile中創建多個鏡像時,可以使用多個 FROM 指令(每個鏡像一次),
2.2 MAINTAINER
格式為 MAINTAINER <name>,指定維護者資訊,
2.3 RUN
格式為 RUN <command> 或 RUN ["executable", "param1", "param2"],
前者將在 shell 終端中運行命令,即 /bin/sh -c;后者則使用 exec 執行,指定使用其它終端可以通過第二種方式實作,例如 RUN ["/bin/bash", "-c", "echo hello"],
每條 RUN 指令將在當前鏡像基礎上執行指定命令,并提交為新的鏡像,當命令較長時可以使用 \ 來換行,
2.4 CMD
支持三種格式
- CMD ["executable","param1","param2"] 使用 exec 執行,推薦方式;
- CMD command param1 param2 在 /bin/sh 中執行,提供給需要互動的應用;
- CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認引數;
指定啟動容器時執行的命令,每個 Dockerfile 只能有一條 CMD 命令,如果指定了多條命令,只有最后一潭訓被執行,
如果用戶啟動容器時候指定了運行的命令,則會覆寫掉 CMD 指定的命令,
2.5 EXPOSE
格式為 EXPOSE <port> [<port>...],
告訴 Docker 服務端容器暴露的埠號,供互聯系統使用,在啟動容器時需要通過 -P,Docker 主機會自動分配一個埠轉發到指定的埠,
2.6 ENV
格式為 ENV <key> <value>, 指定一個環境變數,會被后續 RUN 指令使用,并在容器運行時保持,
例如
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
2.7 ADD
格式為 ADD <src> <dest>,
該命令將復制指定的 <src> 到容器中的 <dest>, 其中 <src> 可以是Dockerfile所在目錄的一個相對路徑;也可以是一個 URL;還可以是一個 tar 檔案(自動解壓為目錄),
2.8 COPY
格式為 COPY <src> <dest>,
復制本地主機的 <src>(為 Dockerfile 所在目錄的相對路徑)到容器中的 <dest>,
當使用本地目錄為源目錄時,推薦使用 COPY,
ENTRYPOINT
兩種格式:
- ENTRYPOINT ["executable", "param1", "param2"]
- ENTRYPOINT command param1 param2(shell中執行),
配置容器啟動后執行的命令,并且不可被 docker run 提供的引數覆寫,
每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最后一個起效,
2.9 VOLUME
格式為 VOLUME ["/data"],
創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放資料庫和需要保持的資料等,
2.10 USER
格式為 USER daemon,
指定運行容器時的用戶名或 UID,后續的 RUN 也會使用指定用戶,
當服務不需要管理員權限時,可以通過該命令指定運行用戶,并且可以在之前創建所需要的用戶,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres,要臨時獲取管理員權限可以使用 gosu,而不推薦 sudo,
2.11 WORKDIR
格式為 WORKDIR /path/to/workdir,
為后續的 RUN、CMD、ENTRYPOINT 指令配置作業目錄,
可以使用多個 WORKDIR 指令,后續命令如果引數是相對路徑,則會基于之前命令指定的路徑,例如
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
則最終路徑為 /a/b/c,
2.12 ONBUILD
格式為 ONBUILD [INSTRUCTION],
配置當所創建的鏡像作為其它新創建鏡像的基礎鏡像時,所執行的操作指令,
例如,Dockerfile 使用如下的內容創建了鏡像 image-A,
[...]
ONBUILD ADD .
/app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
如果基于 image-A 創建新的鏡像時,新的Dockerfile中使用 FROM image-A指定基礎鏡像時,會自動執行ONBUILD 指令內容,等價于在后面添加了兩條指令,
FROM image-A
#Automatically run the following
ADD .
/app/src
RUN /usr/local/bin/python-build --dir /app/src
使用 ONBUILD 指令的鏡像,推薦在標簽中注明,例如 ruby:1.9-onbuild,
3、創建鏡像
撰寫完成 Dockerfile 之后,可以通過 docker build 命令來創建鏡像,
基本的格式為 docker build [選項] 路徑,該命令將讀取指定路徑下(包括子目錄)的 Dockerfile,并將該路徑下所有內容發送給 Docker 服務端,由服務端來創建鏡像,因此一般建議放置 Dockerfile 的目錄為空目錄,也可以通過 .dockerignore 檔案(每一行添加一條匹配模式)來讓 Docker 忽略路徑下的目錄和檔案,
要指定鏡像的標簽資訊,可以通過 -t 選項,例如
$ sudo docker build -t myrepo/myapp /tmp/test1/
例子
- # flask web
- FROM python:alpine
- COPY ./code /code
- WORKDIR /code
- RUN pip install -r requirements.txt
- CMD ["python", "app.py"]
- docker build . -t [取名]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/107620.html
標籤:其他
下一篇:Docker安裝
