Dockerfile命令參數(shù)的具體使用
Docker通過讀取Dockerfile文件的命令生成鏡像。Dockerfile是一個文本文件,包含用戶構(gòu)建鏡像的所需要的全部命令。執(zhí)行docker build后 ,docker通過一系列命令行操作自動構(gòu)建鏡像。本文描述Dockerfile中的命令。
Dockerfile的用法
docker build命令使用Dockerfile文件和構(gòu)建鏡像的上下文環(huán)境。上下文環(huán)境可以是一個本地目錄,也可以是一個git倉庫url。上下文環(huán)境的識別是遞歸的,因此指定一個本地目錄的同時所有子目錄會自動包含進去,指定git url時倉庫的所有子模塊也會被自動包含。下面命令表示使用當(dāng)前目錄(.)做為上下文環(huán)境。
docker build .
構(gòu)建鏡像由docker守護進程執(zhí)行,不是客戶端執(zhí)行。構(gòu)建進程首先將整個上下文環(huán)境整個發(fā)送給docker守護進程。所以最好指定的上下文環(huán)境目錄只包含構(gòu)建鏡像所需要的文件和Dockerfile文件就好了。(不建議使用 / 根目錄作為上下文環(huán)境,否則會導(dǎo)致將整個本地磁盤的文件發(fā)給docker守護進程)。
上下文中不需要的內(nèi)容可以添加到.dockerignore文件中,docker客戶端不會將 .dockerignore文件聲明的文件發(fā)送給docker daemon
默認(rèn)情況下Dockerfile文件名就是“Dockerfile”,并且放在上下文環(huán)境的一級目錄下。也可以用 -f 參數(shù)指定其他位置
docker build -f /path/to/a/Dockerfile .
用 -t 指定鏡像的倉庫名稱和tag
docker build -t shykes/myapp .
同一個鏡像可以指定給多個倉庫,用多個 -t
docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .
Docker使用構(gòu)建緩存加速構(gòu)建的過程,build過程中顯示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)建的過程。--cache-from 允許指定外部緩存。
轉(zhuǎn)義符聲明
格式
# escape=\ (backslash)
或者
# escape=` (backtick)
非必填項,必須放在第一行,以 # 開頭
默認(rèn)的轉(zhuǎn)義符是 \ ,命令太長一行寫不完可以這樣寫
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)上比較好用,因為windows上 \ 是文件路徑分隔符,使用 其他字符可以避免不必要的麻煩。
# escape=` FROM microsoft/nanoserver COPY testfile.txt c:\ RUN dir c:\
注意:只能放在第一行,通常后面跟一個空行,在FROM之前聲明,否則就會認(rèn)為是注釋而不生效。Dockerfile中除了這個聲明之外,其他 # 開頭的都認(rèn)為是注釋。
FROM
FROM [--platform=<platform>] <image> [AS <name>]
指定基礎(chǔ)鏡像,之后的構(gòu)建都是基于這個基礎(chǔ)鏡像生成。一個Dockerfile中可以有多個FROM,用于生成多個鏡像。
--platform 可選參數(shù),用于指定構(gòu)建平臺,例如linux/amd64, linux/arm64, windows/amd64
ARG指令是唯一一個可以在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
下面兩個命令效果是一樣的
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中只能有一個CMD,如果寫了多個,只有最后一個會生效。
CMD的主要目的是給容器運行提供默認(rèn)的命令。容器運行也可以用ENTRYPOINT,此時CMD作為ENTRYPOINT的參數(shù),兩者都要用json格式。
exec格式不會調(diào)用shell,CMD [ "echo", "$HOME" ] 是不對的,要么為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時指定其他命令,CMD將會被覆蓋。
不要將RUN和CMD混淆。RUN是打鏡像過程中真正會執(zhí)行,提交到執(zhí)行結(jié)果中。CMD在打鏡像時并不會執(zhí)行,只是指定一個命令給鏡像,真正執(zhí)行是在鏡像啟動時。
LABEL
LABEL <key>=<value> <key>=<value> <key>=<value> ...
LABEL給鏡像添加元數(shù)據(jù)信息。格式為key value對,一個鏡像可以包含多個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ǔ)鏡像繼承,同一個label,最新的賦值會覆蓋以前的。
通過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容器將會監(jiān)聽哪個端口,指定指定TCP或者UDP,默認(rèn)是TCP。
EXPOSE不會真的發(fā)布這個端口,它其實是構(gòu)建鏡像的人給運行鏡像的人提供的說明,真正暴露端口是在docker run的時候,通過 -p 或者-P 參數(shù)指定,將主機端口映射到容器端口。
docker run -p 80:80/tcp -p 80:80/udp ...
容器間的網(wǎng)絡(luò)通信可以使用docker network相關(guān)指令進行,而不用暴露到主機。
ENV
ENV <key>=<value> ...
設(shè)置環(huán)境變量,允許在同一個ENV后面設(shè)置多個環(huán)境變量
ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \ MY_CAT=fluffy
如果某個環(huán)境變量只想在打鏡像的時候使用,而不賦值到最終的鏡像,可以在單條指令中指定
RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y ...
或者使用ARG,也不會賦值到最終的鏡像中
ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y ...
另外一種格式是不用=,這種格式一次只能定義一個變量
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開頭的文件到 /mydir/中。
dest 如果是相對路徑,就是 WORKDIR的相對路徑
添加 “test.txt” 到 <WORKDIR>/relativeDir/ :
ADD test.txt relativeDir/
添加 “test.txt” 到 /absoluteDir/ :
ADD test.txt /absoluteDir/
注意幾點:
- <src> 路徑必須是上下文環(huán)境中的文件
- 如果<src>是url, <dest>末尾不以反斜杠結(jié)尾,文件被下載后被重命名為<dest>的值
- 如果<src>是url并且<dest>以反斜杠結(jié)尾,文件下載為 /<dest>/<filename>
- 如果<src>是目錄,目錄下所有文件都會拷貝,包括文件元信息。注意目錄本身不會被拷貝,只拷貝目錄里的內(nèi)容
- 如果<src>是壓縮包,拷貝時會自動解壓。URL中的壓縮包不會解壓。
- <dest> 如果不以反斜杠結(jié)尾,會被識別為文件,拷貝的源文件會被重命名為<dest>,如果以反斜杠結(jié)尾就認(rèn)為是目錄,原文件會拷貝到<dest>目錄下
- <dest>中包含的路徑如果不存在會被自動創(chuàng)建
COPY
COPY [--chown=<user>:<group>] <src>... <dest> COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
拷貝文件的功能和ADD一樣,不能自動解壓壓縮包,不能拷貝URL
有個可選參數(shù)--from=<name> 可以把之前構(gòu)造的步驟作為原文件位置(FROM .. AS <name>)
COPY和ADD命令中,源文件如果被修改,從COPY或者ADD起,后面的命令緩存都會失效
ENTRYPOINT
exec 格式
ENTRYPOINT ["executable", "param1", "param2"]
shell格式
ENTRYPOINT command param1 param2
docker run <image> 時傳入的的參數(shù)會傳給ENTRYPOINT,并且會覆蓋CMD,例如docker run <image> -d 命令的-d參數(shù)會傳給entry point。 docker run --entrypoint 會覆蓋ENTRYPOINT命令。
shell格式的entrypoint不接受CMD或者run 傳遞的參數(shù)。
Dockerfile中只有最后一個ENTRYPOINT會生效。
CMD和ENTRYPOINT的關(guān)系
- Dockerfile中至少應(yīng)該包含CMD和ENTRYPOINT中的一個
- CMD應(yīng)該被用作ENTRYPOINT的默認(rèn)參數(shù),運行時可以被覆蓋
下面的表格顯示不同CMD和ENTRYPOINT組合后最終執(zhí)行的命令
VOLUME
VOLUME ["/data"]
VOLUME /data
創(chuàng)建一個可以從本地機器掛載到容器的目錄
例如
FROM ubuntu RUN mkdir /myvol RUN echo "hello world" > /myvol/greeting VOLUME /myvol
注意:
- 使用Windows-based容器時,掛載的必須是一個空目錄,并且不能是C盤
- volume聲明的目錄,之后在Dockerfile中對這個目錄做的修改都會無效
- json格式聲明必須用雙引號,不能是單引號
- 掛載的主機目錄只能在運行時指定
USER
USER <user>[:<group>]
USER <UID>[:<GID>]
指定構(gòu)建鏡像運行時的用戶和用戶組(可選)
如果是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命令的工作目錄
可以指定多次,如果是相對目錄,最后的值為前一個WORKDIR的先對目錄,例如
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>]
指定一個打鏡像過程中的環(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是從開始聲明的那一行開始生效,而不是使用的那一行開始,例如
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òu)造階段聲明的ARG只在該階段生效,如果多個階段都需要,則每個階段都要聲明,如下
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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
SHELL
SHELL ["executable", "parameters"]
到此這篇關(guān)于Dockerfile命令參數(shù)的具體使用的文章就介紹到這了,更多相關(guān)Dockerfile命令參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker-compose java.net.UnknownHostException問題
這篇文章主要介紹了docker-compose java.net.UnknownHostException問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05CentOS7.6系統(tǒng)下Docker安裝部署教程
這篇文章主要為大家介紹了CentOS7.6系統(tǒng)下Docker的安裝部署教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2022-04-04docker?運行花生殼實現(xiàn)內(nèi)外網(wǎng)穿透的詳細(xì)過程
這篇文章主要介紹了docker?運行花生殼實現(xiàn)內(nèi)外網(wǎng)穿透,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03