欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Dockerfile命令參數(shù)的具體使用

 更新時(shí)間:2024年06月10日 09:53:20   作者:記憶機(jī)器  
Dockerfile是一個(gè)文本文件,包含用戶構(gòu)建鏡像的所需要的全部命令,本文主要介紹了Dockerfile命令參數(shù)的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下

Docker通過(guò)讀取Dockerfile文件的命令生成鏡像。Dockerfile是一個(gè)文本文件,包含用戶構(gòu)建鏡像的所需要的全部命令。執(zhí)行docker build后 ,docker通過(guò)一系列命令行操作自動(dòng)構(gòu)建鏡像。本文描述Dockerfile中的命令。

Dockerfile的用法

docker build命令使用Dockerfile文件和構(gòu)建鏡像的上下文環(huán)境。上下文環(huán)境可以是一個(gè)本地目錄,也可以是一個(gè)git倉(cāng)庫(kù)url。上下文環(huán)境的識(shí)別是遞歸的,因此指定一個(gè)本地目錄的同時(shí)所有子目錄會(huì)自動(dòng)包含進(jìn)去,指定git url時(shí)倉(cāng)庫(kù)的所有子模塊也會(huì)被自動(dòng)包含。下面命令表示使用當(dāng)前目錄(.)做為上下文環(huán)境。

docker build .

構(gòu)建鏡像由docker守護(hù)進(jìn)程執(zhí)行,不是客戶端執(zhí)行。構(gòu)建進(jìn)程首先將整個(gè)上下文環(huán)境整個(gè)發(fā)送給docker守護(hù)進(jìn)程。所以最好指定的上下文環(huán)境目錄只包含構(gòu)建鏡像所需要的文件和Dockerfile文件就好了。(不建議使用 / 根目錄作為上下文環(huán)境,否則會(huì)導(dǎo)致將整個(gè)本地磁盤的文件發(fā)給docker守護(hù)進(jìn)程)。

上下文中不需要的內(nèi)容可以添加到.dockerignore文件中,docker客戶端不會(huì)將 .dockerignore文件聲明的文件發(fā)送給docker daemon

默認(rèn)情況下Dockerfile文件名就是“Dockerfile”,并且放在上下文環(huán)境的一級(jí)目錄下。也可以用 -f 參數(shù)指定其他位置

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

用 -t 指定鏡像的倉(cāng)庫(kù)名稱和tag

docker build -t shykes/myapp .

同一個(gè)鏡像可以指定給多個(gè)倉(cāng)庫(kù),用多個(gè) -t

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

Docker使用構(gòu)建緩存加速構(gòu)建的過(guò)程,build過(guò)程中顯示CACHED

docker build -t svendowideit/ambassador .
 [internal] load build definition from Dockerfile                       0.1s
 => transferring dockerfile: 286B                                       0.0s
 [internal] load .dockerignore                                          0.1s
 => transferring context: 2B                                            0.0s
 [internal] load metadata for docker.io/library/alpine:3.2              0.4s
 CACHED [1/2] FROM docker.io/library/alpine:3.2@sha256:e9a2035f9d0d7ce  0.0s
 CACHED [2/2] RUN apk add --no-cache socat                              0.0s
 exporting to image                                                     0.0s
 => exporting layers                                                    0.0s
 => writing image sha256:1affb80ca37018ac12067fa2af38cc5bcc2a8f09963de  0.0s
 => naming to docker.io/svendowideit/ambassador                         0.0s

緩存基于你上次構(gòu)建的過(guò)程。--cache-from 允許指定外部緩存。

轉(zhuǎn)義符聲明

格式

# escape=\ (backslash)

或者

# escape=` (backtick)

非必填項(xiàng),必須放在第一行,以 # 開(kāi)頭

默認(rèn)的轉(zhuǎn)義符是 \ ,命令太長(zhǎng)一行寫不完可以這樣寫

RUN echo "import os" >>  /root/.jupyter/jupyter_server_config.py \
        && echo "c.ServerApp.token = ''" >> /root/.jupyter/jupyter_server_config.py \
        && echo "c.ServerApp.password = ''" >> /root/.jupyter/jupyter_server_config.py \

指定escape為其他字符,在windows系統(tǒng)上比較好用,因?yàn)閣indows上 \ 是文件路徑分隔符,使用 其他字符可以避免不必要的麻煩。

# escape=`

FROM microsoft/nanoserver
COPY testfile.txt c:\
RUN dir c:\

注意:只能放在第一行,通常后面跟一個(gè)空行,在FROM之前聲明,否則就會(huì)認(rèn)為是注釋而不生效。Dockerfile中除了這個(gè)聲明之外,其他 # 開(kāi)頭的都認(rèn)為是注釋。

FROM

FROM [--platform=<platform>] <image> [AS <name>]

指定基礎(chǔ)鏡像,之后的構(gòu)建都是基于這個(gè)基礎(chǔ)鏡像生成。一個(gè)Dockerfile中可以有多個(gè)FROM,用于生成多個(gè)鏡像。

--platform 可選參數(shù),用于指定構(gòu)建平臺(tái),例如linux/amd64, linux/arm64, windows/amd64

ARG指令是唯一一個(gè)可以在FROM之前聲明的指令。

ARG  CODE_VERSION=latest
FROM base:${CODE_VERSION}
CMD  /code/run-app

FROM extras:${CODE_VERSION}
CMD  /code/run-extras

RUN

RUN <command>

shell格式,執(zhí)行shell命令,默認(rèn)是linux 的 /bin/sh -c,  Windows 的cmd /S /C

下面兩個(gè)命令效果是一樣的

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

也可使用下面的格式

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

例如

RUN ["/bin/bash", "-c", "echo hello"]

命令參數(shù)以json格式傳入

CMD

三種形式

  • CMD ["executable","param1","param2"]       exec格式,最多使用
  • CMD ["param1","param2"]                            作為ENTRYPOINT命令的默認(rèn)參數(shù)
  • CMD command param1 param2                   shell格式

Dockerfile中只能有一個(gè)CMD,如果寫了多個(gè),只有最后一個(gè)會(huì)生效。

CMD的主要目的是給容器運(yùn)行提供默認(rèn)的命令。容器運(yùn)行也可以用ENTRYPOINT,此時(shí)CMD作為ENTRYPOINT的參數(shù),兩者都要用json格式。

exec格式不會(huì)調(diào)用shell,CMD [ "echo", "$HOME" ] 是不對(duì)的,要么為sehll 格式: CMD echo $HOME,要么用: CMD [ "sh", "-c", "echo $HOME" ]。

如果用shell,命令以 /bin/sh -c執(zhí)行

FROM ubuntu
CMD echo "This is a test." | wc -

如果不用shell,必須以json格式,指定命令的全路徑,這種方式比較常用

FROM ubuntu
CMD ["/usr/bin/wc","--help"]

如果用戶執(zhí)行 docker run時(shí)指定其他命令,CMD將會(huì)被覆蓋。

不要將RUN和CMD混淆。RUN是打鏡像過(guò)程中真正會(huì)執(zhí)行,提交到執(zhí)行結(jié)果中。CMD在打鏡像時(shí)并不會(huì)執(zhí)行,只是指定一個(gè)命令給鏡像,真正執(zhí)行是在鏡像啟動(dòng)時(shí)。

LABEL

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

LABEL給鏡像添加元數(shù)據(jù)信息。格式為key value對(duì),一個(gè)鏡像可以包含多個(gè)LABEL

LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."

LABEL可以從基礎(chǔ)鏡像繼承,同一個(gè)label,最新的賦值會(huì)覆蓋以前的。

通過(guò)docker image inspect  --format=''  myimage可以查看鏡像的labels

docker image inspect --format='' myimage

結(jié)果: 

{
  "com.example.vendor": "ACME Incorporated",
  "com.example.label-with-value": "foo",
  "version": "1.0",
  "description": "This text illustrates that label-values can span multiple lines.",
  "multi.label1": "value1",
  "multi.label2": "value2",
  "other": "value3"
}

MAINTAINER (deprecated)

指定鏡像作者, 新版本不再推薦使用,官方建議用LABEL代替。例如

LABEL org.opencontainers.image.authors="SvenDowideit@home.org.au"

 EXPOSE

EXPOSE <port> [<port>/<protocol>...]

 告知Docker容器將會(huì)監(jiān)聽(tīng)哪個(gè)端口,指定指定TCP或者UDP,默認(rèn)是TCP。

EXPOSE不會(huì)真的發(fā)布這個(gè)端口,它其實(shí)是構(gòu)建鏡像的人給運(yùn)行鏡像的人提供的說(shuō)明,真正暴露端口是在docker run的時(shí)候,通過(guò) -p 或者-P 參數(shù)指定,將主機(jī)端口映射到容器端口。

 docker run -p 80:80/tcp -p 80:80/udp ...

容器間的網(wǎng)絡(luò)通信可以使用docker network相關(guān)指令進(jìn)行,而不用暴露到主機(jī)。

ENV

ENV <key>=<value> ...

設(shè)置環(huán)境變量,允許在同一個(gè)ENV后面設(shè)置多個(gè)環(huán)境變量

ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \
    MY_CAT=fluffy

如果某個(gè)環(huán)境變量只想在打鏡像的時(shí)候使用,而不賦值到最終的鏡像,可以在單條指令中指定

RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y ...

或者使用ARG,也不會(huì)賦值到最終的鏡像中

ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update &amp;&amp; apt-get install -y ...

 另外一種格式是不用=,這種格式一次只能定義一個(gè)變量

ENV MY_VAR my-value

ADD

ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]

 --chown 可選參數(shù),只支持linux容器

src可以是上下文環(huán)境中的文件或者URL,src中可以使用通配符,例如

ADD hom* /mydir/

將添加所有hom開(kāi)頭的文件到 /mydir/中。

dest 如果是相對(duì)路徑,就是 WORKDIR的相對(duì)路徑

添加  “test.txt” 到 <WORKDIR>/relativeDir/ :

ADD test.txt relativeDir/

添加 “test.txt” 到 /absoluteDir/ :

ADD test.txt /absoluteDir/

注意幾點(diǎn):

  • <src> 路徑必須是上下文環(huán)境中的文件
  • 如果<src>是url, <dest>末尾不以反斜杠結(jié)尾,文件被下載后被重命名為<dest>的值
  • 如果<src>是url并且<dest>以反斜杠結(jié)尾,文件下載為 /<dest>/<filename>
  • 如果<src>是目錄,目錄下所有文件都會(huì)拷貝,包括文件元信息。注意目錄本身不會(huì)被拷貝,只拷貝目錄里的內(nèi)容
  • 如果<src>是壓縮包,拷貝時(shí)會(huì)自動(dòng)解壓。URL中的壓縮包不會(huì)解壓。
  • <dest> 如果不以反斜杠結(jié)尾,會(huì)被識(shí)別為文件,拷貝的源文件會(huì)被重命名為<dest>,如果以反斜杠結(jié)尾就認(rèn)為是目錄,原文件會(huì)拷貝到<dest>目錄下
  • <dest>中包含的路徑如果不存在會(huì)被自動(dòng)創(chuàng)建

COPY

COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]

拷貝文件的功能和ADD一樣,不能自動(dòng)解壓壓縮包,不能拷貝URL

有個(gè)可選參數(shù)--from=<name> 可以把之前構(gòu)造的步驟作為原文件位置(FROM .. AS <name>)

COPY和ADD命令中,源文件如果被修改,從COPY或者ADD起,后面的命令緩存都會(huì)失效

ENTRYPOINT

exec 格式

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

 shell格式

ENTRYPOINT command param1 param2

docker run <image> 時(shí)傳入的的參數(shù)會(huì)傳給ENTRYPOINT,并且會(huì)覆蓋CMD,例如docker run <image> -d 命令的-d參數(shù)會(huì)傳給entry point。 docker run --entrypoint  會(huì)覆蓋ENTRYPOINT命令。

shell格式的entrypoint不接受CMD或者run 傳遞的參數(shù)。

Dockerfile中只有最后一個(gè)ENTRYPOINT會(huì)生效。

CMD和ENTRYPOINT的關(guān)系

  • Dockerfile中至少應(yīng)該包含CMD和ENTRYPOINT中的一個(gè)
  • CMD應(yīng)該被用作ENTRYPOINT的默認(rèn)參數(shù),運(yùn)行時(shí)可以被覆蓋

下面的表格顯示不同CMD和ENTRYPOINT組合后最終執(zhí)行的命令

VOLUME

VOLUME ["/data"]
VOLUME /data

創(chuàng)建一個(gè)可以從本地機(jī)器掛載到容器的目錄

例如

FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

注意:

  • 使用Windows-based容器時(shí),掛載的必須是一個(gè)空目錄,并且不能是C盤
  • volume聲明的目錄,之后在Dockerfile中對(duì)這個(gè)目錄做的修改都會(huì)無(wú)效
  • json格式聲明必須用雙引號(hào),不能是單引號(hào)
  • 掛載的主機(jī)目錄只能在運(yùn)行時(shí)指定

USER

USER <user>[:<group>]
USER <UID>[:<GID>]

指定構(gòu)建鏡像運(yùn)行時(shí)的用戶和用戶組(可選)

如果是windows鏡像,必須先創(chuàng)建用戶

FROM microsoft/windowsservercore
# Create Windows user in the container
RUN net user /add patrick
# Set it for subsequent commands
USER patrick

WORKDIR

WORKDIR /path/to/workdir

指定所有RUN 、CMD、ENTRYPOINT、ADD命令的工作目錄

可以指定多次,如果是相對(duì)目錄,最后的值為前一個(gè)WORKDIR的先對(duì)目錄,例如

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

輸出為 /a/b/c

可以使用環(huán)境變量定義,例如

ENV DIRPATH=/path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd

輸出為/path/$DIRNAME

ARG

ARG <name>[=<default value>]

指定一個(gè)打鏡像過(guò)程中的環(huán)境變量,docker build --build-arg <varname>=<value>

FROM busybox
ARG user1
ARG buildno
# ...

指定默認(rèn)值

FROM busybox
ARG user1=someuser
ARG buildno=1
# ...

ARG的作用范圍

ARG是從開(kāi)始聲明的那一行開(kāi)始生效,而不是使用的那一行開(kāi)始,例如

FROM busybox
USER ${user:-some_user}
ARG user
USER $user
# ...

執(zhí)行

docker build --build-arg user=what_user .

第二行的USER值為some_user,第四行的USER值為what_user

一個(gè)構(gòu)造階段聲明的ARG只在該階段生效,如果多個(gè)階段都需要,則每個(gè)階段都要聲明,如下

FROM busybox
ARG SETTINGS
RUN ./run/setup $SETTINGS

FROM busybox
ARG SETTINGS
RUN ./run/other $SETTINGS

預(yù)定義的ARG

  • HTTP_PROXY
  • http_proxy
  • HTTPS_PROXY
  • https_proxy
  • FTP_PROXY
  • ftp_proxy
  • NO_PROXY
  • no_proxy

使用

 docker build --build-arg HTTPS_PROXY=https://my-proxy.example.com .

OBBUILD

ONBUILD <INSTRUCTION>

STOPSIGNAL

STOPSIGNAL signal

HEALTHCHECK

HEALTHCHECK [OPTIONS] CMD command

HEALTHCHECK NONE

到此這篇關(guān)于Dockerfile命令參數(shù)的具體使用的文章就介紹到這了,更多相關(guān)Dockerfile命令參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

SHELL

SHELL ["executable", "parameters"]

到此這篇關(guān)于Dockerfile命令參數(shù)的具體使用的文章就介紹到這了,更多相關(guān)Dockerfile命令參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • docker空間爆滿導(dǎo)致的進(jìn)入容器失敗的解決方案

    docker空間爆滿導(dǎo)致的進(jìn)入容器失敗的解決方案

    這篇文章主要介紹了docker空間爆滿導(dǎo)致的進(jìn)入容器失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • docker-compose java.net.UnknownHostException問(wèn)題

    docker-compose java.net.UnknownHostException問(wèn)題

    這篇文章主要介紹了docker-compose java.net.UnknownHostException問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • docker如何自定義網(wǎng)絡(luò)問(wèn)題

    docker如何自定義網(wǎng)絡(luò)問(wèn)題

    這篇文章主要介紹了docker如何自定義網(wǎng)絡(luò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • docker可視化工具Portainer部署并漢化的操作

    docker可視化工具Portainer部署并漢化的操作

    這篇文章主要介紹了docker可視化工具Portainer部署并漢化的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • Docker Swarm入門實(shí)例詳解

    Docker Swarm入門實(shí)例詳解

    這篇文章主要介紹了Docker Swarm 入門實(shí)例詳解的相關(guān)內(nèi)容,小編覺(jué)得十分不錯(cuò),在這里給大家分享下,需要的朋友可以參考。
    2017-10-10
  • Docker?文件系統(tǒng)-AUFS?原理介紹

    Docker?文件系統(tǒng)-AUFS?原理介紹

    這篇文章主要介紹了Docker?文件系統(tǒng)-AUFS原理,Docker?主要是基于?Namespace、cgroups?和聯(lián)合文件系統(tǒng)這三大核心技術(shù)實(shí)現(xiàn)的,下文相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-04-04
  • CentOS7.6系統(tǒng)下Docker安裝部署教程

    CentOS7.6系統(tǒng)下Docker安裝部署教程

    這篇文章主要為大家介紹了CentOS7.6系統(tǒng)下Docker的安裝部署教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • docker?運(yùn)行花生殼實(shí)現(xiàn)內(nèi)外網(wǎng)穿透的詳細(xì)過(guò)程

    docker?運(yùn)行花生殼實(shí)現(xiàn)內(nèi)外網(wǎng)穿透的詳細(xì)過(guò)程

    這篇文章主要介紹了docker?運(yùn)行花生殼實(shí)現(xiàn)內(nèi)外網(wǎng)穿透,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Docker容器數(shù)據(jù)卷原理及使用方法解析

    Docker容器數(shù)據(jù)卷原理及使用方法解析

    這篇文章主要介紹了Docker容器數(shù)據(jù)卷原理及使用方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • docker 詳解設(shè)置容器防火墻

    docker 詳解設(shè)置容器防火墻

    這篇文章主要介紹了docker 詳解設(shè)置容器防火墻的相關(guān)資料,需要的朋友可以參考下
    2017-01-01

最新評(píng)論