Dockerfile
RUN <命令行命令>
# <命令行命令> 等同於,在終端操作的 shell 命令。
exec格式
RUN ["可執行文件", "參數1", "參數2"] # 例如: # RUN ["./test.php", "dev", "offline"] 等價於 RUN ./test.php dev offline
多一個run都會在docker上新建一層,過多層,使鏡像過大。可以用 && 組合命令。 這樣就只有一個run 就只有一層。
FROM centos RUN yum install wget RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" RUN tar -xvf redis.tar.gz 以上執行會創建 3 層鏡像。可簡化為以下格式: FROM centos RUN yum install wget \ && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \ && tar -xvf redis.tar.gz
COPY:
COPY [--chown=<user>:<group>] <源路徑1>... <目標路徑> COPY [--chown=<user>:<group>] ["<源路徑1>",... "<目標路徑>"]
[--chown=<user>:<group>]:可選參數,用戶改變復制到容器內文件的擁有者和屬組。
<源路徑>:源文件或者源目錄,這里可以是通配符表達式,其通配符規則要滿足 Go 的 filepath.Match 規則。例如:
COPY hom* /mydir/
COPY hom?.txt /mydir/
<目標路徑>:容器內的指定路徑,該路徑不用事先建好,路徑不存在的話,會自動創建。
CMD 在docker run 時運行。
RUN 是在 docker build。
作用 在容器啟動時候運行默認的程序,程序結束,容器就結束了。cmd指令指定的程序會被docker run命令行參數中指定運行的程序覆蓋。
注意 如果DockerFile中有多個cmd,只有最后一個生效。
shell格式
CMD <shell 命令>
exec格式 推薦使用
CMD ["<可執行文件或命令>","<param1>","<param2>",...] CMD ["<param1>","<param2>",...] # 該寫法是為 ENTRYPOINT 指令指定的程序提供默認參數
ENTRYPOINT:
類似於 CMD 指令, 在容器啟動時候運行默認的程序,程序結束,容器就結束了。但其不會被 docker run 的命令行參數指定的指令所覆蓋,而且這些命令行參數會被當作參數送給 ENTRYPOINT 指令指定的程序。但是, 如果運行 docker run 時使用了 --entrypoint 選項,此選項的參數可當作要運行的程序覆蓋 ENTRYPOINT 指令指定的程序。
當指定了 ENTRYPOINT 后, CMD 的含義就發生了改變,不再是直接的運行其命令,而是將 CMD 的內容作為參數傳給 ENTRYPOINT 指令
優點:在執行 docker run 的時候可以指定 ENTRYPOINT 運行所需的參數。
注意:如果 Dockerfile 中如果存在多個 ENTRYPOINT 指令,僅最后一個生效。
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
可以搭配 CMD 命令使用:一般是變參才會使用 CMD ,這里的 CMD 等於是在給 ENTRYPOINT 傳參,以下示例會提到。
FROM nginx ENTRYPOINT ["nginx", "-c"] # 定參 CMD ["/etc/nginx/nginx.conf"] # 變參 run命令中可以修改的
不傳參數
$ docker run nginx:test
容器內會默認運行以下命令,啟動主進程。
nginx -c /etc/nginx/nginx.conf
傳參數 $ docker run nginx:test -c /etc/nginx/new.conf 容器內會默認運行以下命令 nginx -c /etc/nginx/new.conf
ENV:
設置環境變量,定義了環境變量,那么在后續的指令中,就可以使用這個環境變量。
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
以下示例設置 NODE_VERSION = 7.2.0 , 在后續的指令中可以通過 $NODE_VERSION 引用:
ENV NODE_VERSION 7.2.0 RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \ && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
ARG:
構建參數,與 ENV 作用一至。不過作用域不一樣。ARG 設置的環境變量僅對 Dockerfile 內有效,也就是說只有 docker build 的過程中有效,構建好的鏡像內不存在此環境變量。
構建命令 docker build 中可以用 --build-arg <參數名>=<值> 來覆蓋。
ARG <參數名>[=<默認值>]
EXPOSE:
聲明鏡像端口
- 幫助鏡像使用者理解這個鏡像服務的守護端口,以方便配置映射。
- 在運行時使用隨機端口映射時,也就是 docker run -P 時,會自動隨機映射 EXPOSE 的端口。
EXPOSE <端口1> [<端口2>...]
WORKDIR:
工作目錄
#test FROM ubuntu MAINTAINER hello RUN mkdir /mydir RUN echo hello world > /mydir/test.txt WORKDIR /mydir CMD ["more" ,"test.txt"]
CMD ["more" ,"test.txt"] 中沒有指定test.txt的目錄,就可以直接輸出,原因是制定了工作目錄為/mydir,相當於cd
可以在 docker run命令中用 -w參數覆蓋掉WORKDIR指令的設置。
USER:
用於指定執行后續命令的用戶和用戶組,這邊只是切換后續命令執行的用戶(用戶和用戶組必須提前已經存在)。
USER <用戶名>[:<用戶組>]
一個.net core項目的dockefile文件
FROM hub.xxxxx.cn/public/dotnet-core:v2.2.2 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone WORKDIR /app EXPOSE 8000 COPY . /app WORKDIR /app ENTRYPOINT [ "dotnet", "/app/xxx.dll" ]
Docker build
--build-arg=[] :設置鏡像創建時的變量; --cpu-shares :設置 cpu 使用權重; --cpu-period :限制 CPU CFS周期; --cpu-quota :限制 CPU CFS配額; --cpuset-cpus :指定使用的CPU id; --cpuset-mems :指定使用的內存 id; --disable-content-trust :忽略校驗,默認開啟; -f :指定要使用的Dockerfile路徑; --force-rm :設置鏡像過程中刪除中間容器; --isolation :使用容器隔離技術; --label=[] :設置鏡像使用的元數據; -m :設置內存最大值; --memory-swap :設置Swap的最大值為內存+swap,"-1"表示不限swap; --no-cache :創建鏡像的過程不使用緩存; --pull :嘗試去更新鏡像的新版本; --quiet, -q :安靜模式,成功后只輸出鏡像 ID; --rm :設置鏡像成功后刪除中間容器; --shm-size :設置/dev/shm的大小,默認值是64M; --ulimit :Ulimit配置。 --tag, -t: 鏡像的名字及標簽,通常 name:tag 或者 name 格式;可以在一次構建中為一個鏡像設置多個標簽。 --network: 默認 default。在構建期間設置RUN指令的網絡模式
docker build -t XXX/CRMAPI:v1 .
使用URL github.com/creack/docker-firefox 的 Dockerfile 創建鏡像。
docker build github.com/creack/docker-firefox
也可以通過 -f Dockerfile 文件的位置:
$ docker build -f /path/to/a/Dockerfile .
docker build -t nginx:test .
最后的 . 是上下文路徑。
上下文路徑,是指 docker 在構建鏡像,有時候想要使用到本機的文件(比如復制),docker build 命令得知這個路徑后,會將路徑下的所有內容打包。
解析:由於 docker 的運行模式是 C/S。我們本機是 C,docker 引擎是 S。實際的構建過程是在 docker 引擎下完成的,所以這個時候無法用到我們本機的文件。這就需要把我們本機的指定目錄下的文件一起打包提供給 docker 引擎使用。
如果未說明最后一個參數,那么默認上下文路徑就是 Dockerfile 所在的位置。
注意:上下文路徑下不要放無用的文件,因為會一起打包發送給 docker 引擎,如果文件過多會造成過程緩慢。
Docker run