自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

我們一起聊聊Docker And Dockerfile

開(kāi)發(fā) 開(kāi)發(fā)工具
Dockerfile 是構(gòu)建 Docker 鏡像的核心工具,它使得鏡像構(gòu)建過(guò)程變得簡(jiǎn)單、可重復(fù)和高效。通過(guò)本文的介紹,你已經(jīng)了解了 Dockerfile 的基本語(yǔ)法和常用指令,以及一些最佳實(shí)踐。隨著你的實(shí)踐和深入學(xué)習(xí),相信你將能夠創(chuàng)建出更加優(yōu)秀的 Docker 鏡像,并更好地應(yīng)用 Docker 在軟件開(kāi)發(fā)和部署中。

對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),會(huì)Docker而不知道Dockerfile等于不會(huì)Docker,上一篇文章帶大家學(xué)習(xí)了Docker的基本使用方法:《一文帶你學(xué)會(huì)Docker》,今天了不起帶大家學(xué)習(xí)一下Dockerfile,幫助你快速上手并創(chuàng)建高效的 Docker 鏡像。

了解Dockerfile

Dockerfile 是一個(gè)文本文件,用于定義 Docker 鏡像的構(gòu)建過(guò)程。它以指令的形式描述了如何構(gòu)建鏡像,從基礎(chǔ)鏡像開(kāi)始逐步添加配置、文件和依賴(lài),最終形成我們所需要的鏡像。為我們提供了一種簡(jiǎn)單且可重復(fù)的方式來(lái)定義鏡像構(gòu)建過(guò)程。

Dockerfile 指令

  • FROM 指令: FROM 指令是 Dockerfile 的第一條指令,用于指定基礎(chǔ)鏡像。選擇合適的基礎(chǔ)鏡像非常重要,因?yàn)樗鼘⒅苯佑绊戠R像的大小和性能。我們還可以利用多階段構(gòu)建來(lái)減小鏡像大小。
  • RUN 指令: RUN 指令用于在鏡像構(gòu)建過(guò)程中執(zhí)行命令。通過(guò) RUN,我們可以安裝軟件包、運(yùn)行腳本以及配置環(huán)境。
  • COPY 和 ADD 指令: 這兩個(gè)指令用于將本地文件復(fù)制到鏡像中。區(qū)別在于 ADD 指令支持自動(dòng)解壓縮和遠(yuǎn)程 URL,但推薦使用 COPY 指令,因?yàn)樗鞔_和可預(yù)測(cè)。
  • CMD 和 ENTRYPOINT 指令: 這兩個(gè)指令用于定義容器啟動(dòng)時(shí)要執(zhí)行的命令。CMD 定義的命令可以被 docker run 命令行參數(shù)所覆蓋,而 ENTRYPOINT 定義的命令會(huì)一直執(zhí)行。

以下是一個(gè)簡(jiǎn)單的Dockerfile 示例:

# 使用 openjdk 鏡像作為基礎(chǔ)鏡像
FROM openjdk:latest

# 設(shè)置工作目錄
WORKDIR /app

# 復(fù)制 Java 項(xiàng)目的 JAR 文件到鏡像中
COPY target/myapp.jar /app/

# 定義容器啟動(dòng)時(shí)執(zhí)行的命令
CMD ["java", "-jar", "myapp.jar"]

在上面的示例中,我們使用 openjdk:latest 作為基礎(chǔ)鏡像,并將 Java 項(xiàng)目的 JAR 文件復(fù)制到鏡像中。然后,通過(guò) CMD 指令定義了容器啟動(dòng)時(shí)執(zhí)行的命令,即運(yùn)行 java -jar myapp.jar 啟動(dòng) Java 應(yīng)用程序。

多階段構(gòu)建

多階段構(gòu)建是一種優(yōu)化 Docker 鏡像大小的技巧,特別適用于構(gòu)建 Java 項(xiàng)目等編譯型語(yǔ)言的應(yīng)用。在多階段構(gòu)建中,我們可以在一個(gè) Dockerfile 中定義多個(gè) FROM 指令,每個(gè)指令表示一個(gè)構(gòu)建階段。最終鏡像只保留最后一個(gè) FROM 指令所定義的階段,其他中間產(chǎn)物都不會(huì)包含在最終鏡像中,從而減小鏡像的體積。

Dockerfile 示例:

# 第一階段:構(gòu)建 Java 項(xiàng)目
FROM maven:latest AS builder

WORKDIR /app

COPY pom.xml .
RUN mvn dependency:go-offline

COPY src/ /app/src/
RUN mvn package

# 第二階段:運(yùn)行 Java 項(xiàng)目
FROM openjdk:latest

WORKDIR /app

COPY --from=builder /app/target/myapp.jar /app/

CMD ["java", "-jar", "myapp.jar"]

在上面的示例中,我們使用了兩個(gè) FROM 指令:

FROM maven:latest AS builder 表示第一階段構(gòu)建 Java 項(xiàng)目,使用 Maven 鏡像進(jìn)行依賴(lài)安裝和項(xiàng)目構(gòu)建;

FROM openjdk:latest 表示第二階段,使用 OpenJDK 鏡像來(lái)運(yùn)行 Java 項(xiàng)目。通過(guò) COPY --from 指令,我們從第一階段的鏡像中復(fù)制構(gòu)建好的 JAR 文件到第二階段,從而減小了最終鏡像的大小。

Dockerfile 高級(jí)用法

  • 使用 ARG 和 ENV: ARG 指令用于在構(gòu)建過(guò)程中傳遞參數(shù),而 ENV 指令用于設(shè)置環(huán)境變量。利用這些指令,我們可以更靈活地定制鏡像的構(gòu)建過(guò)程。
  • 使用 WORKDIR: WORKDIR 指令用于設(shè)置工作目錄,即在容器內(nèi)運(yùn)行命令的默認(rèn)目錄。這樣可以使 Dockerfile 更易讀和維護(hù)。
  • 使用 VOLUME: VOLUME 指令用于在容器中創(chuàng)建掛載點(diǎn),使得容器中的數(shù)據(jù)可以持久化保存在宿主機(jī)上。

Dockerfile 示例:

# 第一階段:構(gòu)建 Java 項(xiàng)目
FROM maven:latest AS builder

# 使用 ARG 指令傳遞構(gòu)建參數(shù)
ARG APP_VERSION=1.0.0
ARG BUILD_ENV=production

# 設(shè)置工作目錄
WORKDIR /app

# 復(fù)制 pom.xml 并安裝項(xiàng)目依賴(lài)
COPY pom.xml .
RUN mvn dependency:go-offline

# 復(fù)制源代碼并構(gòu)建項(xiàng)目
COPY src/ /app/src/
RUN mvn package -DskipTests

# 第二階段:運(yùn)行 Java 項(xiàng)目
FROM openjdk:latest

# 使用 ENV 指令設(shè)置環(huán)境變量
ENV APP_PORT=8080
ENV BUILD_ENV=${BUILD_ENV}

# 使用 VOLUME 指令創(chuàng)建掛載點(diǎn)
VOLUME /app/logs

# 設(shè)置工作目錄
WORKDIR /app

# 復(fù)制構(gòu)建好的 JAR 文件到鏡像中
COPY --from=builder /app/target/myapp-${APP_VERSION}.jar /app/

# 定義容器啟動(dòng)時(shí)執(zhí)行的命令
CMD ["java", "-jar", "myapp-${APP_VERSION}.jar", "--port=${APP_PORT}", "--env=${BUILD_ENV}"]

在上面的示例中,我們首先使用 ARG 指令來(lái)定義構(gòu)建參數(shù) APP_VERSION 和 BUILD_ENV,并在 FROM maven:latest AS builder 階段中使用 ARG 指令傳遞構(gòu)建參數(shù)。

這樣,在構(gòu)建時(shí)可以通過(guò) --build-arg 參數(shù)來(lái)傳遞具體的值,例如:

cssCopy code
docker build --build-arg APP_VERSION=2.0.0 --build-arg BUILD_ENV=staging -t my-java-app .

這樣可以構(gòu)建不同版本和不同環(huán)境的鏡像。

同時(shí),我們使用 VOLUME 指令創(chuàng)建了掛載點(diǎn) /app/logs,使得容器中的日志文件可以持久化保存在宿主機(jī)上。

小結(jié)

Dockerfile 是構(gòu)建 Docker 鏡像的核心工具,它使得鏡像構(gòu)建過(guò)程變得簡(jiǎn)單、可重復(fù)和高效。通過(guò)本文的介紹,你已經(jīng)了解了 Dockerfile 的基本語(yǔ)法和常用指令,以及一些最佳實(shí)踐。隨著你的實(shí)踐和深入學(xué)習(xí),相信你將能夠創(chuàng)建出更加優(yōu)秀的 Docker 鏡像,并更好地應(yīng)用 Docker 在軟件開(kāi)發(fā)和部署中。


責(zé)任編輯:武曉燕 來(lái)源: Java技術(shù)指北
相關(guān)推薦

2024-07-26 09:47:28

2022-05-24 08:21:16

數(shù)據(jù)安全API

2023-08-10 08:28:46

網(wǎng)絡(luò)編程通信

2023-09-10 21:42:31

2023-06-30 08:18:51

敏捷開(kāi)發(fā)模式

2021-08-27 07:06:10

IOJava抽象

2024-02-20 21:34:16

循環(huán)GolangGo

2023-08-14 07:10:38

Docker部署項(xiàng)目

2022-02-23 08:41:58

NATIPv4IPv6

2022-09-22 08:06:29

計(jì)算機(jī)平板微信

2021-08-12 07:49:24

mysql

2023-03-26 23:47:32

Go內(nèi)存模型

2024-11-28 09:57:50

C#事件發(fā)布器

2022-10-08 00:00:05

SQL機(jī)制結(jié)構(gòu)

2023-07-24 09:41:08

自動(dòng)駕駛技術(shù)交通

2022-06-26 09:40:55

Django框架服務(wù)

2022-02-14 07:03:31

網(wǎng)站安全MFA

2022-10-28 07:27:17

Netty異步Future

2022-11-12 12:33:38

CSS預(yù)處理器Sass

2023-04-26 07:30:00

promptUI非結(jié)構(gòu)化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)