国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

云服務(wù)器|WEB服務(wù)器|FTP服務(wù)器|郵件服務(wù)器|虛擬主機|服務(wù)器安全|DNS服務(wù)器|服務(wù)器知識|Nginx|IIS|Tomcat|

服務(wù)器之家 - 服務(wù)器技術(shù) - 服務(wù)器知識 - Docker中鏡像構(gòu)建文件Dockerfile與相關(guān)命令的詳細介紹

Docker中鏡像構(gòu)建文件Dockerfile與相關(guān)命令的詳細介紹

2021-01-13 20:33Docker教程網(wǎng) 服務(wù)器知識

這篇文章主要介紹了Docker中鏡像構(gòu)建文件Dockerfile與相關(guān)命令的相關(guān)資料,文中介紹的很詳細,相信對大家具有一定的參考價值,有需要的朋友們下面來一起看看吧。

前言

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

1. Dockerfile文件使用

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

構(gòu)建鏡像

將當(dāng)前目錄做為構(gòu)建上下文時,可以像下面這樣使用docker build命令構(gòu)建鏡像:

?
1
2
3
$ docker build .
Sending build context to Docker daemon 6.51 MB
...

說明:構(gòu)建會在Docker后臺守護進程(daemon)中執(zhí)行,而不是CLI中。構(gòu)建前,構(gòu)建進程會將全部內(nèi)容(遞歸)發(fā)送到守護進程。大多情況下,應(yīng)該將一個空目錄作為構(gòu)建上下文環(huán)境,并將Dockerfile文件放在該目錄下。

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

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

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

構(gòu)建時,還可以通過-t參數(shù)指定構(gòu)建成后,鏡像的倉庫、標(biāo)簽等:

鏡像標(biāo)簽

?
1
$ docker build -t shykes/myapp .

如果存在多個倉庫下,或使用多個鏡像標(biāo)簽,就可以使用多個-t參數(shù):

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

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

?
1
2
3
$ docker build -t test/myapp .
Sending build context to Docker daemon 2.048 kB
Error response from daemon: Unknown instruction: RUNCMD

緩存

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

Dockerfile文件中的每條指令會被獨立執(zhí)行,并會創(chuàng)建一個新鏡像,RUN cd /tmp等命令不會對下條指令產(chǎn)生影響。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ docker build -t svendowideit/ambassador .
Sending build context to Docker daemon 15.36 kB
Step 1/4 : FROM alpine:3.2
 ---> 31f630c65071
Step 2/4 : MAINTAINER SvenDowideit@home.org.au
 ---> Using cache
 ---> 2a1c91448f5f
Step 3/4 : RUN apk update && apk add socat && rm -r /var/cache/
 ---> Using cache
 ---> 21ed6e7fbb73
Step 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
 ---> 7ea8aef582cc
Successfully built 7ea8aef582cc

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

2. Dockerfile文件格式

Dockerfile文件格式如下:

?
1
2
# Comment
INSTRUCTION arguments
?
1
2
# 注釋
指令 參數(shù)

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

Docker 會依次執(zhí)行Dockerfile中的指令,文件中的第一條指令必須是FROM,F(xiàn)ROM指令用于指定一個基礎(chǔ)鏡像。

以#開頭的行,Docker會認(rèn)為是注釋。但#出現(xiàn)在指令參數(shù)中時,則不是注釋。如:

?
1
2
# Comment
RUN echo 'we are running some # of cool things'

3. Dockerfile中使用指令

3.1 FROM

FROM指令用于指定其后構(gòu)建新鏡像所使用的基礎(chǔ)鏡像。FROM指令必是Dockerfile文件中的首條命令,啟動構(gòu)建流程后,Docker將會基于該鏡像構(gòu)建新鏡像,F(xiàn)ROM后的命令也會基于這個基礎(chǔ)鏡像。

FROM語法格式為:

?
1
FROM <image>

?
1
FROM <image>:<tag>

?
1
FROM <image>:<digest>

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

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

3.2 RUN

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

shell執(zhí)行

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

注意:通過SHELL命令修改RUN所使用的默認(rèn)shell

?
1
RUN <command>

exec執(zhí)行

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

RUN可以執(zhí)行任何命令,然后在當(dāng)前鏡像上創(chuàng)建一個新層并提交。提交后的結(jié)果鏡像將會用在Dockerfile文件的下一步。

通過RUN執(zhí)行多條命令時,可以通過\換行執(zhí)行:

?
1
2
RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'

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

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

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

3.3 CMD

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

?
1
2
3
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

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

CMD與RUN在功能實現(xiàn)上也有相似之處。如:

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

等價于:

?
1
cmd ["/bin/true"]

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

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

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

?
1
CMD ["/bin/bash"]

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

?
1
2
$ sudo docker run -i -t itbilu/test
root@e3597c81aef4:/#

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

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

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

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

3.4 ENTRYPOINT

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

?
1
2
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

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

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

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

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

?
1
ENTRYPOINT ["/usr/bin/nginx"]

完整構(gòu)建代碼:

?
1
2
3
4
5
6
7
8
9
# Version: 0.0.3
FROM ubuntu:16.04
MAINTAINER 何民三 "cn.liuht@gmail.com"
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hello World, 我是個容器' \
 > /var/www/html/index.html
ENTRYPOINT ["/usr/sbin/nginx"]
EXPOSE 80

使用docker build構(gòu)建鏡像,并將鏡像指定為itbilu/test:

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

構(gòu)建完成后,使用itbilu/test啟動一個容器:

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

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

3.5 LABEL

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

?
1
LABEL <key>=<value> <key>=<value> <key>=<value> ...

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

如,通過LABEL指定一些元數(shù)據(jù):

?
1
LABEL version="1.0" description="這是一個Web服務(wù)器" by="IT筆錄"

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

?
1
2
3
4
5
6
$sudo docker inspect itbilu/test
"Labels": {
 "version": "1.0",
 "description": "這是一個Web服務(wù)器",
 "by": "IT筆錄"
},

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

?
1
LABEL maintainer="itbilu.com"

3.6 EXPOSE

EXPOSE用于指定容器在運行時監(jiān)聽的端口:

?
1
EXPOSE <port> [<port>...]

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

3.7 ENV

ENV用于設(shè)置環(huán)境變量,其有以下兩種設(shè)置形式:

?
1
2
ENV <key> <value>
ENV <key>=<value> ...

如,通過ENV設(shè)置一個環(huán)境變量:

?
1
ENV ITBILU_PATH /home/itbilu/

設(shè)置后,這個環(huán)境變量在ENV命令后都可以使用。如:

?
1
WORKERDIR $ITBILU_PATH

這些環(huán)境變量不僅可以構(gòu)建鏡像過程使用,使用該鏡像創(chuàng)建的容器中也可以使用。如:

?
1
2
3
$ docker run -i -t itbilu/test
root@196ca123c0c3:/# cd $ITBILU_PATH
root@196ca123c0c3:/home/itbilu#

3.8 ADD

ADD用于復(fù)制構(gòu)建環(huán)境中的文件或目錄到鏡像中。其有以下兩種使用方式:

?
1
2
ADD <src>... <dest>
ADD ["<src>",... "<dest>"]

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

如,通過ADD復(fù)制一個網(wǎng)絡(luò)文件:

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

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

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

3.9 COPY

COPY同樣用于復(fù)制構(gòu)建環(huán)境中的文件或目錄到鏡像中。其有以下兩種使用方式:

?
1
2
COPY <src>... <dest>
COPY ["<src>",... "<dest>"]

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

3.10 VOLUME

VOLUME用于創(chuàng)建掛載點,即向基于所構(gòu)建鏡像創(chuàng)始的容器添加卷:

?
1
VOLUME ["/data"]

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

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

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

如,通過VOLUME創(chuàng)建一個掛載點:

?
1
2
ENV ITBILU_PATH /home/itbilu/
VOLUME [$ITBILU_PATH]

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

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

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

3.11 USER

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

?
1
USER daemon

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

?
1
2
3
4
5
6
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group

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

3.12 WORKDIR

WORKDIR用于在容器內(nèi)設(shè)置一個工作目錄:

?
1
WORKDIR /path/to/workdir

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

如,使用WORKDIR設(shè)置工作目錄:

?
1
2
3
4
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

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

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

3.13 ARG

ARG用于指定傳遞給構(gòu)建運行時的變量:

?
1
ARG <name>[=<default value>]

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

?
1
2
ARG site
ARG build_user=IT筆錄

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

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

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

3.14 ONBUILD

ONBUILD用于設(shè)置鏡像觸發(fā)器:

?
1
ONBUILD [INSTRUCTION]

當(dāng)所構(gòu)建的鏡像被用做其它鏡像的基礎(chǔ)鏡像,該鏡像中的觸發(fā)器將會被鑰觸發(fā)。

如,當(dāng)鏡像被使用時,可能需要做一些處理:

?
1
2
3
4
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]

3.15 STOPSIGNAL

STOPSIGNAL用于設(shè)置停止容器所要發(fā)送的系統(tǒng)調(diào)用信號:

?
1
STOPSIGNAL signal

所使用的信號必須是內(nèi)核系統(tǒng)調(diào)用表中的合法的值,如:9、SIGKILL。

3.16 SHELL

SHELL用于設(shè)置執(zhí)行命令(shell式)所使用的的默認(rèn)shell類型:

?
1
SHELL ["executable", "parameters"]

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM microsoft/windowsservercore
 
# Executed as cmd /S /C echo default
RUN echo default
 
# Executed as cmd /S /C powershell -command Write-Host default
RUN powershell -command Write-Host default
 
# Executed as powershell -command Write-Host hello
SHELL ["powershell", "-command"]
RUN Write-Host hello
 
# Executed as cmd /S /C echo hello
SHELL ["cmd", "/S"", "/C"]
RUN echo hello

總結(jié)

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

原文鏈接:https://itbilu.com/linux/docker/VyhM5wPuz.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 一区二区福利 | 亚洲免费影院 | 国内成人免费视频 | 久久久久久久久久久福利观看 | 成人精品久久久 | 亚洲中午字幕 | 电影91久久久 | 在线观看国产视频 | 91视频大全 | 亚洲欧美综合乱码精品成人网 | 久久精品久久久 | 成人国产精品156免费观看 | 久久一二三四 | 国产精品欧美久久久久一区二区 | 夜色影院在线观看 | 伊人在线 | 来个一级毛片 | 日韩欧美视频一区 | 91久久国产精品 | 日本不卡免费新一二三区 | 日韩成人免费 | 亚洲视频精品在线 | 久久亚洲一区二区三区明星换脸 | 久久精品无码一区二区日韩av | 91精品国产乱码久久久久久 | 日韩成人在线视频 | 成人欧美一区二区三区在线观看 | 日韩福利| 国产精品久久一区二区三区 | 精久久久 | 国产免费久久 | 亚洲激情在线视频 | 中文字幕影视 | 欧美精品久久久久久久久老牛影院 | 国产日韩一级片 | 做a视频免费观看 | 亚洲国产精品久久久久秋霞蜜臀 | 久久久高清| 久久大香| 久久久久久久久久久免费 | www.亚洲|