tft每日頭條

 > 科技

 > dockerfile的基本命令

dockerfile的基本命令

科技 更新时间:2024-12-28 03:00:51

鏡像的定制實際上就是定制每一層所添加的配置、文件。我們可以把每一層修改、安裝、構建、操作的命令都寫入一個腳本,這個腳本就是Dockerfile。Dockerfile是一個文本文件,其内包含了一條條的指令,每一條指令構建一層,因此每一條指令的内容,就是描述該層應當如何構建。

FROM指令

該指令指定基礎鏡像,然後對鏡像進行定制。

FROM ubuntu:16.04

Docker還存在一個特殊的鏡像,名為scratch,它表示一個空白鏡像,如果你以scratch為基礎鏡像的話,意味着你不以任何鏡像為基礎,接下來所寫的指令将作為鏡像的第一層。對于Linux下靜态編譯的程序來說,并不需要有操作系統提供運行時支持,所需的一切庫都已經在可執行文件裡了,因此直接FROM scratch會讓鏡像體積更加小巧。

示例:

FROM scratch

....

RUN指令

RUN指令是用來執行命令行命令的。其格式有兩種:

shell格式:RUN <命令>

RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

exec格式:RUN ["可執行文件", "參數1", "參數2"]

RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 RUN make -C /usr/src/redis RUN make -C /usr/src/redis install

COPY指令

複制文件指令,格式如下:

COPY <源路徑> <容器内目标路徑>

## 示例 COPY a.txt /usr/text/ ## 多個源文件 COPY a.txt b.txt /usr/text/ ## 通配符形式 COPY hom* /mydir/ COPY hom?.txt /mydir/

ADD指令

ADD和COPY的格式和性質基本一緻。但是在COPY基礎上增加了一些功能。比如<源路徑>可以是一個URL,這種情況下,Docker引擎會試圖去下載這個鍊接的文件放到<目标路徑>去。

ADD适合需要自動解壓縮的場合,因此可以遵循這樣的原則,所有的文件複制均使用COPY指令,僅在需要自動解壓縮的場合使用ADD。

CMD指令

就是用于指定容器主進程默認啟動命令的。格式如下:

shell格式:CMD <命令>

exec格式:CMD ["參數1","參數2", ...]

參數列表格式:CMD ["參數1","參數2", ...]。在指定了ENTRYPOINT指定後,用CMD指定具體的參數。

ENTRYPOINT指令

ENTRYPOINT的目的和CMD一樣,都是在指定容器啟動程序及參數。ENTRYPOINT在運行時也可以替代,不過比CMD要略顯繁瑣,需要通過docker run 的參數 --entrypoint來指定。當指定了ENTRYPOINT後,CMD的含義就發生了改變,不再是直接的運行其命令,而是将CMD的内容作為參數傳給ENTRYPOINT指令。

ENV指令

該指令用于設置環境變量,格式有兩種:

ENV <key> <value>

ENV <key1>=<value1> <key2>=<value2>

這個指令很簡單,就是設置環境變量而已,無論是後面的其他指令,如RUN,還是運行時的應用,都可以直接使用這裡定義的環境變量。

ENV VERSION=1.0 DEBUG=on NAME="Leisure" $VERSION # 使用環境變量

下列指令可以支持環境變量:ADD、COPY、ENV、EXPOSE、LABEL、USER、WORKDIR、VOLUME、STOPSIGNAL、ONBUILD

ARG指令

ARG指令用于構建參數,和ENV的效果一樣,都是設置環境變量。格式如下:

ARG <參數名>[=<默認值>]

和ENV不同的是,ARG所設置的構建環境的環境變量,在将來容器運行時是不會存在這些環境變量的。但是不要因此就使用ARG保存密碼之類的信息,因為docker history還是可以看到所有值的。

Dockerfile中的ARG指令是定義參數名稱,以及定義其默認值。該默認值可以在構建命令docker build中用--build-arg <參數名>=<值>來覆蓋

VOLUME指令

該指令用于定義匿名卷,格式為:

VOLUME ["<路徑1>","<路徑2>", ...]

VOLUME <路徑>

VOLUME /data

運行時可以覆蓋這個挂載設置:

docker run -d -v mydata:/data mysql:5.7

在這行命令中,就使用了mydata這個命名卷挂載到了/data這個位置,替代了Dockerfile中定義的匿名卷的挂載配置。

EXPOSE指令

該指令用于聲明端口,格式為:

EXPOSE <端口1> [<端口2> ...]

EXPOSE指令是聲明運行時容器提供服務端口,這隻是一個聲明,在運行時并不會因為這個聲明應用就會開啟這個端口的服務。

聲明端口的好處:

1)幫助鏡像使用者理解這個鏡像服務的守護端口,以方便配置映射;

2)在運行時使用随機端口映射時,也就是docker run -P時,會自動随機映射EXPOSE的端口。

WORKDIR指令

該指令用于指定工作目錄,格式為:

WORKDIR <工作目錄路徑>

使用WORKDIR指令可以來指定工作目錄(或稱為當前目錄),以後各層的當前目錄就被改為指定的目錄,如該目錄不存在,WORKDIR會幫你建立目錄。

初學者可能把Dockerfile等同于Shell腳本來書寫,這種錯誤理解還可能會導緻出現下面這樣的錯誤:

RUN cd /app RUN echo "hello" > world.txt

如果将這個Dockerfile進行構建鏡像運行後,會發現找不到/app/world.txt文件。

USER指令

該指令用于指定當前用戶,格式為

USER <用戶名>

USER指令和WORKDIR相似,都是改變環境狀态并影響以後的層。USER隻是幫你切換到指定用戶,這個用戶必須是事先建立好的,否則無法切換。

ONBUILD指令

ONBUILD是一個特殊的指令,它後面跟的是其他指令,比如RUN,COPY等,而這些指令,在當前鏡像構件時并不會被執行。隻有當以當前鏡像為基礎鏡像,去構建下一級鏡像的時候才會被執行。Dockerfile中的其他指令都是為了定制當前鏡像而準備的,唯有ONBUILD是為了幫助别人定制自己而準備的。

MAINTAINER指令

用于指定作者,格式為:

MAINTAINER <name>

MAINTAINER leisure <leisure.wang>

dockerfile的基本命令(Dockerfile文件常用指令詳解)1

dockerfile的基本命令(Dockerfile文件常用指令詳解)2

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved