## **Dockerfile介紹(摘自網絡)**
Dockerfile是由一系列命令和參數構成的腳本,這些命令應用于基礎鏡像并最終創建一個新的鏡像。它們簡化了從頭到尾的流程并極大的簡化了部署工作。Dockerfile從FROM命令開始,緊接著跟隨者各種方法,命令和參數。其產出為一個新的可以用于創建容器的鏡像。
### **簡單的教程**
```
#指定鏡像,如果本地不存在那么會去hub pull下來
From node:10.11.0
#指定工作目錄
WORKDIR /usr/local/myapp
#將軟件包添加到指定目錄
#需要注意的是使用ADD如果 src 是一個tar包,那么會自動解壓,并且src支持網絡路徑。
#還有一個注意的點,app.tar.gz一定要和Dockerfile文件同目錄
ADD app.tar.gz /usr/local/myapp
#開放的端口
EXPOSE 10086
#運行的命令,注意容器會自己記錄日志,所以如果是java等去運行的時候別去守護進程和忽略日志
CMD node server
```
# 參數說明(摘自網絡):
**FROM**
指定基礎鏡像,生成新鏡像必須指定一個基礎鏡像,然后在此基礎鏡像上逐一運行隨后的指令,最后生成新鏡像,例如:
```
FROM ubuntu:16.04
```
**RUN**
在鏡像內運行命令,注意,這是在鏡像打包過程中運行的命令,不是啟動容器后的命令。RUN指令常常用來在鏡像打包過程中安裝軟件,例如:
```
RUN apt-get update \
&& apt-get install nginx
```
> 可以使用轉移符 \ 書寫多行指令
RUN其實調用的是標準的shell,所以可以通過 && 連接執行多個命令
**CMD**
指定容器啟動時執行的命令,注意,和RUN的區別是:RUN是在打包過程中執行的命令。鏡像中只能有一條CMD指令,如果有多個CMD指令,則以最后一條為準,所以我們可以覆蓋基礎鏡像中定義的CMD指令。CMD指令支持三種格式:
```
CMD ["executable", "param1", "param2"] //使用exec執行
//CMD command param1 param2 使用/bin/sh -c執行
CMD ["param1", "param2"] //提供給ENTRYPOINT的默認參數
```
**ENTRYPOINT**
容器啟動入口,即容器啟動后執行的命令,不會被CMD指令覆蓋,如果存在ENTRYPOINT,那么CMD指令會充當ENTRYPOINT的參數。
```
ENTRYPOINT /app/entrypoint.sh
```
**WORKDIR**
指定后續RUN、CMD、ENTRYPOINT程序的工作目錄,可以多次執行,就像Linux的 cd 命令。
```
WORKDIR /app
WORKDIR data
RUN pwd # /app/data
```
**USER**
指定后續RUN、CMD、ENTRYPOINT程序的用戶名或UID。
```
USER nginx
```
**ENV**
聲明一個環境變量,可為后續的RUN、CMD、ENTRYPOINT程序所使用。
```
ENV JAVA_HOME /opt/java
```
**EXPOSE**
聲明容器需要暴露的端口號。
```
EXPOSE 80 443
```
**VOLUME**
聲明容器運行時的數據卷掛載點,將主機目錄掛載到容器中,用來持久化保存容器生成的數據。
```
VOLUME /app/data
```
**ADD**
將Dockerfile所在目錄中的文件拷貝到鏡像中,ADD <src> <dest>,如果 src 是一個tar包,那么會自動解壓,并且src支持網絡路徑。
```
ADD app.tar.gz /usr/local/myapp
```
**COPY**
和ADD類似,格式為 COPY <scr> <dest> ,復制本地文件到容器中,和ADD區別是,不會自動解壓,推薦使用COPY。
```
COPY server.jar /app/server.jar
COPY . /app
COPY dist/* /app/
```