ADD
ADD命令有兩個參數,源和目標。它的基本作用是從源系統的文件系統上覆制文件到目標容器的文件系統。如果源是一個URL,那該URL的內容將被下載並複製到容器中。
COPY
格式爲:COPY
複製本地主機的 (爲 Dockerfile 所在目錄的相對路徑,文件或目錄) 爲容器中的 。目標路徑不存在時,會自動創建。當使用本地目錄爲源目錄時,推薦使用 COPY。
RUN
RUN命令是Dockerfile執行命令的核心部分。它接受命令作爲參數並用於創建鏡像。不像CMD命令,RUN命令用於創建鏡像(在之前commit的層之上形成新的層)。有兩種方式:
1)RUN 例如:RUN sh -c 'source $HOME/.bashrc ; echo $HOME'
2)RUN ["executable", "param1", "param2"] 例如:
一個Dockerfile中可以有多個RUN命令
CMD
和RUN命令相似,CMD可以用於執行特定的命令。和RUN不同的是,這些命令不是在鏡像構建的過程中執行的,而是在Container啓動時執行的命令,一個Dockerfile中只能有一條CMD命令,多條則只執行最後一條CMD。
3種執行格式:
- `CMD ["executable","param1","param2"]` ,`exec`格式,推薦使用這種格式。例如:CMD ["java", "-jar", "spring-boot-maven-docker.jar"]
- `CMD ["param1","param2"]`,作爲`ENTRYPOINT`的默認參數。
- `CMD command param1 param2`,`shell`格式。
ENTRYPOINT
有兩種格式:
ENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT command param1 param2 (shell 中執行)
配置容器啓動後執行的命令,並且不會被 docker run 提供的參數覆蓋。而CMD則會
每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個 ENTRYPOINT 時,只有最後一個生效。例如:
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /userApp.jar" ]
ENV
ENV命令用於設置環境變量。這些變量以”key=value”的形式存在,會被後續 RUN 指令使用,並在容器運行時保持。
EXPOSE
EXPOSE用來指定端口,使容器內的應用可以通過端口和外界交互。
FROM
FROM命令可能是最重要的Dockerfile命令。該命令定義了使用哪個基礎鏡像啓動構建流程。基礎鏡像可以爲任意鏡像。如果基礎鏡像沒有被發現,Docker將試圖從Docker image index來查找該鏡像。FROM命令必須是Dockerfile的首個命令。
MAINTAINER
建議這個命令放在Dockerfile的起始部分,雖然理論上它可以放置於Dockerfile的任意位置。這個命令用於聲明作者,並應該放在FROM的後面。
LABEL
key=value,可以多個。
USER
使用哪個用戶跑container。
VOLUME
可以將本地文件夾或者其他container的文件夾掛載到container中,用於讓你的容器訪問宿主機上的目錄。
WORKDIR
切換目錄用,可以多次切換(相當於cd命令),對RUN,CMD,ENTRYPOINT生效。
【實例】
FROM node
RUN mkdir -p /home/nodejs/user //在鏡像中創建目錄
WORKDIR /home/nodejs/user //cd到鏡像中的目錄
COPY . /home/nodejs/user //拷貝本機中當前目錄內容到鏡像中目錄
RUN npm config set registry https://registry.npm.taobao.org //設置鏡像中npm registry
RUN npm info underscore
RUN npm install //鏡像中執行npm install
RUN npm run build //鏡像中執行編譯
ENV NODE_EVN production //設置鏡像中環境變量
ENV USER_ENV test
ENV USER_PORT 3200
ENV SVR_USER_API_BASE_URL http://test.user.com:8080
EXPOSE 3200
CMD ["npm", "start"]