亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

Docker中鏡像構建文件Dockerfile與相關命令的詳細介紹

2024-09-01 13:50:37
字體:
來源:轉載
供稿:網友

前言

使用docker build命令或使用Docker Hub的自動構建功能構建Docker鏡像時,都需要一個Dockerfile文件。Dockerfile文件是一個由一系列構建指令組成的文本文件,docker build命令會根據這些構建指令完成Docker鏡像的構建。本文將會介紹Dockerfile文件,及其中使用的構建指令。

1. Dockerfile文件使用

docker build命令會根據Dockerfile文件及上下文構建新Docker鏡像。構建上下文是指Dockerfile所在的本地路徑或一個URL(Git倉庫地址)。構建上下文環境會被遞歸處理,所以,構建所指定的路徑還包括了子目錄,而URL還包括了其中指定的子模塊。

構建鏡像

將當前目錄做為構建上下文時,可以像下面這樣使用docker build命令構建鏡像:

$ docker build .Sending build context to Docker daemon 6.51 MB...

說明:構建會在Docker后臺守護進程(daemon)中執行,而不是CLI中。構建前,構建進程會將全部內容(遞歸)發送到守護進程。大多情況下,應該將一個空目錄作為構建上下文環境,并將Dockerfile文件放在該目錄下。

在構建上下文中使用的Dockerfile文件,是一個構建指令文件。為了提高構建性能,可以通過.dockerignore文件排除上下文目錄下,不需要的文件和目錄。

Dockerfile一般位于構建上下文的根目錄下,也可以通過-f指定該文件的位置:

$ docker build -f /path/to/a/Dockerfile .

構建時,還可以通過-t參數指定構建成后,鏡像的倉庫、標簽等:

鏡像標簽

$ docker build -t shykes/myapp .

如果存在多個倉庫下,或使用多個鏡像標簽,就可以使用多個-t參數:

$ docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .

在Docker守護進程執行Dockerfile中的指令前,首先會對Dockerfile進行語法檢查,有語法錯誤時會返回:

$ docker build -t test/myapp .Sending build context to Docker daemon 2.048 kBError response from daemon: Unknown instruction: RUNCMD

緩存

Docker 守護進程會一條一條的執行Dockerfile中的指令,而且會在每一步提交并生成一個新鏡像,最后會輸出最終鏡像的ID。生成完成后,Docker 守護進程會自動清理你發送的上下文。

Dockerfile文件中的每條指令會被獨立執行,并會創建一個新鏡像,RUN cd /tmp等命令不會對下條指令產生影響。

Docker 會重用已生成的中間鏡像,以加速docker build的構建速度。以下是一個使用了緩存鏡像的執行過程:

$ docker build -t svendowideit/ambassador .Sending build context to Docker daemon 15.36 kBStep 1/4 : FROM alpine:3.2 ---> 31f630c65071Step 2/4 : MAINTAINER SvenDowideit@home.org.au ---> Using cache ---> 2a1c91448f5fStep 3/4 : RUN apk update && apk add socat && rm -r /var/cache/ ---> Using cache ---> 21ed6e7fbb73Step 4/4 : CMD env | grep _TCP= | (sed 's/.*_PORT_/([0-9]*/)_TCP=tcp://///(.*/):/(.*/)/socat -t 100000000 TCP4-LISTEN:/1,fork,reuseaddr TCP4:/2:/3 /&/' && echo wait) | sh ---> Using cache ---> 7ea8aef582ccSuccessfully built 7ea8aef582cc

構建緩存僅會使用本地父生成鏈上的鏡像。如果不想使用本地緩存的鏡像,也可以通過--cache-from指定緩存。指定后將再不使用本地生成的鏡像鏈,而是從鏡像倉庫中下載。

2. Dockerfile文件格式

Dockerfile文件格式如下:

# CommentINSTRUCTION arguments
# 注釋指令 參數

Dockerfile文件中指令不區分大小寫,但為了更易區分,約定使用大寫形式。

Docker 會依次執行Dockerfile中的指令,文件中的第一條指令必須是FROM,FROM指令用于指定一個基礎鏡像。

以#開頭的行,Docker會認為是注釋。但#出現在指令參數中時,則不是注釋。如:

# CommentRUN echo 'we are running some # of cool things'

3. Dockerfile中使用指令

3.1 FROM

FROM指令用于指定其后構建新鏡像所使用的基礎鏡像。FROM指令必是Dockerfile文件中的首條命令,啟動構建流程后,Docker將會基于該鏡像構建新鏡像,FROM后的命令也會基于這個基礎鏡像。

FROM語法格式為:

FROM <image>

FROM <image>:<tag>

FROM <image>:<digest>

通過FROM指定的鏡像,可以是任何有效的基礎鏡像。FROM有以下限制:

  1. FROM必須是Dockerfile中第一條非注釋命令
  2. 在一個Dockerfile文件中創建多個鏡像時,FROM可以多次出現。只需在每個新命令FROM之前,記錄提交上次的鏡像ID。
  3. tag或digest是可選的,如果不使用這兩個值時,會使用latest版本的基礎鏡像

3.2 RUN

RUN用于在鏡像容器中執行命令,其有以下兩種命令執行方式:

shell執行

在這種方式會在shell中執行命令,Linux下默認使用/bin/sh -c,Windows下使用cmd /S /C。

注意:通過SHELL命令修改RUN所使用的默認shell

RUN <command>

exec執行

RUN ["executable", "param1", "param2"]

RUN可以執行任何命令,然后在當前鏡像上創建一個新層并提交。提交后的結果鏡像將會用在Dockerfile文件的下一步。

通過RUN執行多條命令時,可以通過/換行執行:

RUN /bin/bash -c 'source $HOME/.bashrc; /echo $HOME'

也可以在同一行中,通過分號分隔命令:

RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'

RUN指令創建的中間鏡像會被緩存,并會在下次構建中使用。如果不想使用這些緩存鏡像,可以在構建時指定--no-cache參數,如:docker build --no-cache。

3.3 CMD

CMD用于指定在容器啟動時所要執行的命令。CMD有以下三種格式:

CMD ["executable","param1","param2"]CMD ["param1","param2"]CMD command param1 param2

CMD不同于RUN,CMD用于指定在容器啟動時所要執行的命令,而RUN用于指定鏡像構建時所要執行的命令。

CMD與RUN在功能實現上也有相似之處。如:

docker run -t -i itbilu/static_web_server /bin/true

等價于:

cmd ["/bin/true"]

CMD在Dockerfile文件中僅可指定一次,指定多次時,會覆蓋前的指令。

另外,docker run命令也會覆蓋Dockerfile中CMD命令。如果docker run運行容器時,使用了Dockerfile中CMD相同的命令,就會覆蓋Dockerfile中的CMD命令。

如,我們在構建鏡像的Dockerfile文件中使用了如下指令:

CMD ["/bin/bash"]

使用docker build構建一個新鏡像,鏡像名為itbilu/test。構建完成后,使用這個鏡像運行一個新容器,運行效果如下:

$ sudo docker run -i -t itbilu/testroot@e3597c81aef4:/# 

在使用docker run運行容器時,我們并沒有在命令結尾指定會在容器中執行的命令,這時Docker就會執行在Dockerfile的CMD中指定的命令。

如果不想使用CMD中指定的命令,就可以在docker run命令的結尾指定所要運行的命令:

$ sudo docker run -i -t itbilu/test /bin/ps PID TTY   TIME CMD 1 ?  00:00:00 ps

這時,docker run結尾指定的/bin/ps命令覆蓋了Dockerfile的CMD中指定的命令。

3.4 ENTRYPOINT

ENTRYPOINT用于給容器配置一個可執行程序。也就是說,每次使用鏡像創建容器時,通過ENTRYPOINT指定的程序都會被設置為默認程序。ENTRYPOINT有以下兩種形式:

ENTRYPOINT ["executable", "param1", "param2"]ENTRYPOINT command param1 param2

ENTRYPOINT與CMD非常類似,不同的是通過docker run執行的命令不會覆蓋ENTRYPOINT,而docker run命令中指定的任何參數,都會被當做參數再次傳遞給ENTRYPOINT。Dockerfile中只允許有一個ENTRYPOINT命令,多指定時會覆蓋前面的設置,而只執行最后的ENTRYPOINT指令。

docker run運行容器時指定的參數都會被傳遞給ENTRYPOINT,且會覆蓋CMD命令指定的參數。如,執行docker run <image> -d時, -d參數將被傳遞給入口點。

也可以通過docker run --entrypoint重寫ENTRYPOINT入口點。

如:可以像下面這樣指定一個容器執行程序:

ENTRYPOINT ["/usr/bin/nginx"]

完整構建代碼:

# Version: 0.0.3FROM ubuntu:16.04MAINTAINER 何民三 "cn.liuht@gmail.com"RUN apt-get updateRUN apt-get install -y nginxRUN echo 'Hello World, 我是個容器' /  > /var/www/html/index.htmlENTRYPOINT ["/usr/sbin/nginx"]EXPOSE 80

使用docker build構建鏡像,并將鏡像指定為itbilu/test:

$ sudo docker build -t="itbilu/test" .

構建完成后,使用itbilu/test啟動一個容器:

$ sudo docker run -i -t itbilu/test -g "daemon off;"

在運行容器時,我們使用了-g "daemon off;" ,這個參數將會被傳遞給ENTRYPOINT,最終在容器中執行的命令為/usr/sbin/nginx -g "daemon off;" 。

3.5 LABEL

LABEL用于為鏡像添加無數據,無數以鍵值對的形式指定:

LABEL <key>=<value> <key>=<value> <key>=<value> ...

使用LABEL指定元數據時,一條LABEL指定可以指定一或多條元數據,指定多條元數據時不同元數據之間通過空格分隔。推薦將所有的元數據通過一條LABEL指令指定,以免生成過多的中間鏡像。

如,通過LABEL指定一些元數據:

LABEL version="1.0" description="這是一個Web服務器" by="IT筆錄"

指定后可以通過docker inspect查看:

$sudo docker inspect itbilu/test"Labels": { "version": "1.0", "description": "這是一個Web服務器", "by": "IT筆錄"},

注意;Dockerfile中還有個MAINTAINER命令,該命令用于指定鏡像作者。但MAINTAINER并不推薦使用,更推薦使用LABEL來指定鏡像作者。如:

LABEL maintainer="itbilu.com"

3.6 EXPOSE

EXPOSE用于指定容器在運行時監聽的端口:

EXPOSE <port> [<port>...]

EXPOSE并不會讓容器的端口訪問到主機。要使其可訪問,需要在docker run運行容器時通過-p來發布這些端口,或通過-P參數來發布EXPOSE導出的所有端口。

3.7 ENV

ENV用于設置環境變量,其有以下兩種設置形式:

ENV <key> <value>ENV <key>=<value> ...

如,通過ENV設置一個環境變量:

ENV ITBILU_PATH /home/itbilu/

設置后,這個環境變量在ENV命令后都可以使用。如:

WORKERDIR $ITBILU_PATH

這些環境變量不僅可以構建鏡像過程使用,使用該鏡像創建的容器中也可以使用。如:

$ docker run -i -t itbilu/test root@196ca123c0c3:/# cd $ITBILU_PATHroot@196ca123c0c3:/home/itbilu#

3.8 ADD

ADD用于復制構建環境中的文件或目錄到鏡像中。其有以下兩種使用方式:

ADD <src>... <dest>ADD ["<src>",... "<dest>"]

通過ADD復制文件時,需要通過<src>指定源文件位置,并通過<dest>來指定目標位置。<src>可以是一個構建上下文中的文件或目錄,也可以是一個URL,但不能訪問構建上下文之外的文件或目錄。

如,通過ADD復制一個網絡文件:

ADD http://wordpress.org/latest.zip $ITBILU_PATH

在上例中,$ITBILU_PATH是我們使用ENV指定的一個環境變量。

另外,如果使用的是本地歸檔文件(gzip、bzip2、xz)時,Docker會自動進行解包操作,類似使用tar -x。

3.9 COPY

COPY同樣用于復制構建環境中的文件或目錄到鏡像中。其有以下兩種使用方式:

COPY <src>... <dest>COPY ["<src>",... "<dest>"]

COPY指令非常類似于ADD,不同點在于COPY只會復制構建目錄下的文件,不能使用URL也不會進行解壓操作。

3.10 VOLUME

VOLUME用于創建掛載點,即向基于所構建鏡像創始的容器添加卷:

VOLUME ["/data"]

一個卷可以存在于一個或多個容器的指定目錄,該目錄可以繞過聯合文件系統,并具有以下功能:

  1. 卷可以容器間共享和重用
  2. 容器并不一定要和其它容器共享卷
  3. 修改卷后會立即生效
  4. 對卷的修改不會對鏡像產生影響
  5. 卷會一直存在,直到沒有任何容器在使用它

VOLUME讓我們可以將源代碼、數據或其它內容添加到鏡像中,而又不并提交到鏡像中,并使我們可以多個容器間共享這些內容。

如,通過VOLUME創建一個掛載點:

ENV ITBILU_PATH /home/itbilu/VOLUME [$ITBILU_PATH]

構建的鏡像,并指定鏡像名為itbilu/test。構建鏡像后,使用新構建的運行一個容器。運行容器時,需-v參將能本地目錄綁定到容器的卷(掛載點)上,以使容器可以訪問宿主機的數據。

$ sudo docker run -i -t -v ~/code/itbilu:/home/itbilu/ itbilu/test root@31b0fac536c4:/# cd /home/itbilu/root@31b0fac536c4:/home/itbilu# lsREADME.md app.js bin config.js controller db demo document lib minify.js node_modules package.json public routes test views

如上所示,我們已經可以容器的/home/itbilu/目錄下訪問到宿主機~/code/itbilu目錄下的數據了。

3.11 USER

USER用于指定運行鏡像所使用的用戶:

USER daemon

使用USER指定用戶時,可以使用用戶名、UID或GID,或是兩者的組合。以下都是合法的指定試:

USER userUSER user:groupUSER uidUSER uid:gidUSER user:gidUSER uid:group

使用USER指定用戶后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都將使用該用戶。鏡像構建完成后,通過docker run運行容器時,可以通過-u參數來覆蓋所指定的用戶。

3.12 WORKDIR

WORKDIR用于在容器內設置一個工作目錄:

WORKDIR /path/to/workdir

通過WORKDIR設置工作目錄后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都會在該目錄下執行。

如,使用WORKDIR設置工作目錄:

WORKDIR /aWORKDIR bWORKDIR cRUN pwd

在以上示例中,pwd最終將會在/a/b/c目錄中執行。

在使用docker run運行容器時,可以通過-w參數覆蓋構建時所設置的工作目錄。

3.13 ARG

ARG用于指定傳遞給構建運行時的變量:

ARG <name>[=<default value>]

如,通過ARG指定兩個變量:

ARG siteARG build_user=IT筆錄

以上我們指定了site和build_user兩個變量,其中build_user指定了默認值。在使用docker build構建鏡像時,可以通過--build-arg <varname>=<value>參數來指定或重設置這些變量的值。

$ sudo docker build --build-arg site=itiblu.com -t itbilu/test .

這樣我們構建了itbilu/test鏡像,其中site會被設置為itbilu.com,由于沒有指定build_user,其值將是默認值IT筆錄。

3.14 ONBUILD

ONBUILD用于設置鏡像觸發器:

ONBUILD [INSTRUCTION]

當所構建的鏡像被用做其它鏡像的基礎鏡像,該鏡像中的觸發器將會被鑰觸發。

如,當鏡像被使用時,可能需要做一些處理:

[...]ONBUILD ADD . /app/srcONBUILD RUN /usr/local/bin/python-build --dir /app/src[...]

3.15 STOPSIGNAL

STOPSIGNAL用于設置停止容器所要發送的系統調用信號:

STOPSIGNAL signal

所使用的信號必須是內核系統調用表中的合法的值,如:9、SIGKILL。

3.16 SHELL

SHELL用于設置執行命令(shell式)所使用的的默認shell類型:

SHELL ["executable", "parameters"]

SHELL在Windows環境下比較有用,Windows下通常會有cmd和powershell兩種shell,可能還會有sh。這時就可以通過SHELL來指定所使用的shell類型:

FROM microsoft/windowsservercore# Executed as cmd /S /C echo defaultRUN echo default# Executed as cmd /S /C powershell -command Write-Host defaultRUN powershell -command Write-Host default# Executed as powershell -command Write-Host helloSHELL ["powershell", "-command"]RUN Write-Host hello# Executed as cmd /S /C echo helloSHELL ["cmd", "/S"", "/C"]RUN echo hello

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日本高清视频| 亚洲女同性videos| 亚洲成人a级网| 精品国产999| 欧美视频一二三| 国产成人精彩在线视频九色| 亚洲视频在线看| 亚洲自拍偷拍色片视频| 欧美性高潮床叫视频| www.亚洲免费视频| 国产精品第一页在线| 亚洲精品短视频| 国产z一区二区三区| 国产免费一区二区三区香蕉精| 国产精品久久久久91| 久久免费视频网站| 日av在线播放中文不卡| 在线播放日韩欧美| 亚洲欧美日韩国产成人| 国产成人精品优优av| 久久久999精品视频| 久久精品中文字幕一区| 成人黄色片网站| 粉嫩老牛aⅴ一区二区三区| 国内精品久久久久久影视8| 国产91精品久久久久久久| 国产精品一区二区3区| 成人国产精品一区| 日本精品中文字幕| 欧美最猛性xxxxx亚洲精品| 欧美性xxxxx极品娇小| 日韩美女免费线视频| 久久久久久这里只有精品| 亚洲精品成人久久| 6080yy精品一区二区三区| 亚洲在线观看视频网站| 欧美孕妇与黑人孕交| 久久国产精品久久精品| xxxx性欧美| 欧美性视频网站| 国产精品国语对白| 综合欧美国产视频二区| 欧美激情视频一区二区| 色噜噜亚洲精品中文字幕| 日韩视频第一页| 国产在线视频91| 亚洲色图av在线| 亚洲成年人影院在线| 国产盗摄xxxx视频xxx69| 97久久精品人搡人人玩| 国产精品视频精品| 日韩国产激情在线| 欧美最猛性xxxx| 久久国产视频网站| 日本一区二区在线播放| 人九九综合九九宗合| 亚洲激情国产精品| 国模视频一区二区三区| 中文精品99久久国产香蕉| 国产精品一区二区性色av| 日韩精品高清视频| 综合欧美国产视频二区| 日韩电影中文字幕| 日韩激情av在线免费观看| 国产精品国产三级国产专播精品人| 国产精品自产拍在线观看| 欧美性猛交xxxx黑人猛交| 国产成人av网址| 国产伦精品一区二区三区精品视频| 狠狠做深爱婷婷久久综合一区| 黑人极品videos精品欧美裸| 55夜色66夜色国产精品视频| 久热精品视频在线观看一区| 国产日韩在线精品av| 精品精品国产国产自在线| 亚洲福利视频久久| 午夜欧美大片免费观看| 另类天堂视频在线观看| 中文字幕视频一区二区在线有码| 国产精品白丝jk喷水视频一区| 久久精品最新地址| 日本国产欧美一区二区三区| 日韩亚洲第一页| 欧美激情伊人电影| 在线观看欧美成人| 中国日韩欧美久久久久久久久| 亚洲国产又黄又爽女人高潮的| 精品久久久久久久久久ntr影视| 国产精品午夜国产小视频| 成人国产精品色哟哟| 国产精品久久久久aaaa九色| 国产精品偷伦一区二区| 久久香蕉精品香蕉| 亚洲小视频在线| 狠狠操狠狠色综合网| 国产精品久久久久久久久久久久久| 性欧美激情精品| 欧美大胆a视频| 国产精品久久久久av免费| 九九热精品在线| 成人免费看吃奶视频网站| 久久亚洲国产精品| 日本亚洲精品在线观看| 欧美电影免费在线观看| 亚洲精品丝袜日韩| 国产精品中文久久久久久久| 亚洲人成啪啪网站| 久久国产精品久久久久久| 亚洲视频axxx| 久久精品国产成人精品| 亚洲第一中文字幕在线观看| 8x拔播拔播x8国产精品| 国产三级精品网站| 国产精品中文久久久久久久| 国产视频在线观看一区二区| 欧美精品videossex性护士| 欧美午夜激情在线| 亚洲国产精品一区二区三区| 欧美日韩精品在线播放| 欧美日韩精品在线观看| 亚洲高清在线观看| 成人性生交大片免费看视频直播| 国产日韩欧美黄色| 在线日韩av观看| 亚洲国产中文字幕久久网| 国产精品久久久久久中文字| 欧美日本高清一区| 欧美激情喷水视频| 国产欧美亚洲视频| 久久久久久久国产精品| 国产精品久久久久久av福利| 黑人巨大精品欧美一区免费视频| 欧美日韩国产精品一区二区三区四区| 亚洲女同精品视频| 中文国产成人精品| 久久久视频精品| 欧美激情奇米色| 欧美第一淫aaasss性| 欧美在线视频免费播放| 国产成人激情视频| 欧美性色视频在线| 欧美激情aaaa| 国产成+人+综合+亚洲欧洲| 美女性感视频久久久| 丝袜一区二区三区| 色狠狠久久aa北条麻妃| xvideos国产精品| 亚洲精品一区二区三区婷婷月| 庆余年2免费日韩剧观看大牛| 九九视频这里只有精品| 色综合亚洲精品激情狠狠| 日韩在线不卡视频| 国产91在线高潮白浆在线观看| 久久久综合免费视频| 亚洲久久久久久久久久| 亚洲黄色有码视频| 亚洲色图校园春色| 91精品视频一区| 欧美一区亚洲一区| 久久国产精品久久久| 久久久久久亚洲| 在线播放国产一区中文字幕剧情欧美| 色伦专区97中文字幕| 国产精品一二三视频|