Dockerfile build run


Dockerfile
From:
定制的鏡像都是基於 FROM 的鏡像
RUN:
執行命令,在鏡像構建的時候會執行。有兩種模式
shell格式
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:

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指令的網絡模式

 

1、dockerfile文件路徑  (常用)
使用當前目錄的 Dockerfile 創建鏡像,標簽為 XXX/CRMAPI:V1。
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 .
 
2、上下文路徑
docker build -t nginx:test .

最后的  .   是上下文路徑。

上下文路徑,是指 docker 在構建鏡像,有時候想要使用到本機的文件(比如復制),docker build 命令得知這個路徑后,會將路徑下的所有內容打包。

解析:由於 docker 的運行模式是 C/S。我們本機是 C,docker 引擎是 S。實際的構建過程是在 docker 引擎下完成的,所以這個時候無法用到我們本機的文件。這就需要把我們本機的指定目錄下的文件一起打包提供給 docker 引擎使用。

如果未說明最后一個參數,那么默認上下文路徑就是 Dockerfile 所在的位置。

注意:上下文路徑下不要放無用的文件,因為會一起打包發送給 docker 引擎,如果文件過多會造成過程緩慢。

 
 

Docker run
docker run -d -p 8030:8000 --cpus=2 -m 2G --memory-swap=2G --env ASPNETCORE_ENVIRONMENT=release -v /data/pf/logs/errorLogs:/app/wwwroot/errorLogs -v /data/pf/logs/NSLogs:/app/wwwroot/NSLogs -v /data/pf/logs/subscribenbusLogs:/app/wwwroot/subscribenbusLogs --name="xxxxx" hub.xxxx.con/xxxxx:latest
 
 
https://www.cnblogs.com/yyxianren/p/12082776.html
 
常用參數
-d后台運行
-i即使沒有連接,也要保持標准輸入保持打開狀態,一般與 -t 連用
-t分配一個偽tty,一般與 -i 連用
 
不用-it  docker attach 就不能用
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM