Dockerfile制作鏡像的常用指令詳解
1.Dockerfile 指令清單
更多更詳細(xì)指令:官網(wǎng) Dockerfile reference | Docker Docs
Dockerfile 指令 | 功能 |
---|---|
FROM | 指定基礎(chǔ)鏡像 |
RUN | 在鏡像構(gòu)建過程中執(zhí)行命令 |
COPY | 將文件或目錄從構(gòu)建環(huán)境復(fù)制到鏡像中 |
ADD | 類似于 COPY,但更強大,支持 URL 和解壓縮操作 |
WORKDIR | 設(shè)置工作目錄 |
ENV | 設(shè)置環(huán)境變量 |
ARG | 定義構(gòu)建時的參數(shù) |
EXPOSE | 聲明容器運行時要監(jiān)聽的端口 |
VOLUME | 創(chuàng)建掛載點,用于持久化數(shù)據(jù) |
CMD | 指定容器啟動時要運行的默認(rèn)命令 |
ENTRYPOINT | 配置容器啟動時執(zhí)行的命令 |
LABEL | 添加元數(shù)據(jù),用于標(biāo)記鏡像 |
USER | 設(shè)置容器中運行命令的用戶 |
SHELL | 配置 shell 類型 |
在包含 Dockerfile 文件的目錄中執(zhí)行以下命令:
docker build -t <image_name>:<tag> <path_to_dockerfile_directory>
-t <image_name>:<tag>
用于指定構(gòu)建的鏡像名稱及標(biāo)簽。<path_to_dockerfile_directory>
是 Dockerfile 所在的目錄路徑。
2. FROM 指令
FROM
指令初始化一個新的構(gòu)建階段,并為后續(xù)指令設(shè)置基礎(chǔ)鏡像。因此,一個有效的 Dockerfile
必須以 FROM
指令開頭。鏡像可以是任何有效的鏡像。
FROM [--platform=<platform>] <image> [AS <name>]
- 參數(shù)
<platform>
: 構(gòu)建的 cpu 架構(gòu),如 Linux/amd 64,Linux/arm 64。<image>
: 指定 base image 的名稱。- AS
<name>
: 指定構(gòu)建步驟的名稱。
3. LABEL 指令
- 為鏡像添加元數(shù)據(jù),元數(shù)據(jù)為鍵值對的形式。
LABEL <key>=<value> <key>=<value> <key>=<value> ...
比如
LABEL author="xiaoming" version="1.0" desc="create ubuntu demo1"
4. COPY 指令
- 用于從
docker
主機復(fù)制新文件或者目錄至創(chuàng)建的新鏡像指定路徑中。
COPY [--chown=<user>:<group>] [--chmod=<perms>] <src>... <dest> # 或 COPY [--chown=<user>:<group>] [--chmod=<perms>] ["<src>",... "<dest>"]
<src>
是構(gòu)建環(huán)境中要復(fù)制的文件或目錄的路徑。<dest>
是要將文件或目錄復(fù)制到容器中的目標(biāo)路徑。
除了基本的格式之外,COPY 指令還支持一些參數(shù)來指定復(fù)制行為:
-chown=<user>:<group>
:設(shè)置文件的所有者和組。例如-chown=root:root
。--from=<source_stage>
:從之前的構(gòu)建階段(指定的構(gòu)建階段或者鏡像)復(fù)制文件。這個參數(shù)可以讓你從一個鏡像或者構(gòu)建階段中復(fù)制文件到當(dāng)前的鏡像。這對于多階段構(gòu)建非常有用。
- 案例:
創(chuàng)建一個 Dockerfile
文件,內(nèi)容如下。
FROM ubuntu:22.04 as demo1 LABEL author="xiaoming" version="1.0" desc="create ubuntu demo1" COPY ./index.html /data/web/html/
- 使用
FROM ubuntu:22.04 as demo1
指令,表示初始化一個新的構(gòu)建階段,并以ubuntu:22.04
鏡像作為基礎(chǔ)鏡像,并將該階段命名為demo1
。 - 使用
LABEL
指令,添加元數(shù)據(jù)信息。author="xiaoming"
表示作者為 "xiaoming";version="1.0"
表示版本為 "1.0";desc="create ubuntu demo1"
表示描述為 "create ubuntu demo 1"。 - 將主機中的當(dāng)前目錄下的
index.html
文件拷貝到容器的/data/web/html/
目錄中。
5. ENV 指令
ENV <key1>=<value1> <key2>=<value2> ...
其中 <key>
是環(huán)境變量的名稱,<value>
是環(huán)境變量的值。這種格式用于設(shè)置單個環(huán)境變量,也可以使用通配符。
FROM ubuntu:22.04 as demo1 LABEL author="xiaoming" version="1.0" desc="create ubuntu demo1" ENV MYROOTDIR=/data/web/html/ # 使用通配符引用 MYROOTDIR COPY ./index.html ${MYROOTDIR} ENV MYTEST=1
6.WORKDIR
WORKDIR
指令用于設(shè)置工作目錄,即在容器中執(zhí)行后續(xù)命令的默認(rèn)目錄。
WORKDIR <directory>
其中 <directory>
是要設(shè)置為工作目錄的路徑??梢允褂媒^對路徑或相對路徑。如果指定的路徑不存在,WORKDIR 指令將創(chuàng)建該目錄。
FROM ubuntu:22.04 as demo1 LABEL author="xiaoming" version="1.0" desc="create ubuntu demo1" # 指定工作目錄 WORKDIR /data/src
構(gòu)建這個鏡像,并啟動。
WORKDIR 指令的作用是設(shè)置容器中執(zhí)行后續(xù)命令的默認(rèn)工作目錄。它影響接下來所有命令執(zhí)行的上下文環(huán)境,使得在Docker 容器中執(zhí)行命令時不必每次都指定完整的路徑。
7. ADD
ADD 指令用于將本地文件、目錄、或遠(yuǎn)程文件 URL 添加到鏡像中。它類似于 COPY 指令,但具有更多的功能,比如會它可以解壓和下載。
ADD <source> <destination>
其中 <source>
是要添加到鏡像中的文件、目錄或 URL,而 <destination>
是文件系統(tǒng)中的目標(biāo)路徑。
FROM ubuntu:22.04 as demo1 LABEL author="xiaoming" version="1.0" desc="create ubuntu demo1" WORKDIR /data/src # 將nginx的源代碼下載到當(dāng)前目錄(/data/src) ADD https://nginx.org/download/nginx-1.24.0.tar.gz .
也可以再進行解壓(過程就不展示了)。
FROM ubuntu:22.04 as demo1 LABEL author="xiaoming" version="1.0" desc="create ubuntu demo1" WORKDIR /data/src # 將nginx的源代碼下載到當(dāng)前目錄(/data/src) ADD https://nginx.org/download/nginx-1.24.0.tar.gz . # 解壓到當(dāng)前目錄(/data/src) ADD ./nginx-1.24.0.tar.gz .
8.RUN
RUN 指令用于在鏡像構(gòu)建過程中執(zhí)行命令。它可以執(zhí)行任何有效的 shell 命令、可執(zhí)行文件或腳本。其基本格式為:
RUN <command> && <command> ……
其中 <command>
是要執(zhí)行的命令。在 Dockerfile 中可以是任何合法的 shell 命令,例如安裝軟件包、運行腳本、創(chuàng)建目錄等。
FROM ubuntu:22.04 as demo1 LABEL author="xiaoming" version="1.0" desc="create ubuntu demo1" WORKDIR /data/src # 將nginx的源代碼下載到當(dāng)前目錄(/data/src) ADD https://nginx.org/download/nginx-1.24.0.tar.gz . # 執(zhí)行 cd 與 tar 命令 RUN cd /data/src && tar zxvf nginx-1.24.0.tar.gz
9. CMD
CMD
是 Dockerfile 中的一條指令,用于設(shè)置容器啟動時默認(rèn)執(zhí)行的命令。它定義了容器啟動時執(zhí)行的主要命令,但是可以被 Docker 命令行中的 docker run
中的參數(shù)覆蓋。
CMD command param1 param2
10. EXPOSE
EXPOSE
是 Dockerfile 中的一條指令,用于聲明容器運行時要監(jiān)聽的端口。這個指令并不會實際打開端口或者創(chuàng)建端口映射,它只是告訴 Docker 容器內(nèi)部運行的應(yīng)用程序應(yīng)該監(jiān)聽哪些端口。
EXPOSE <port> [<port>/<protocol>...]
其中 <port>
是要暴露的端口號,<protocol>
是要使用的網(wǎng)絡(luò)協(xié)議,通常是 tcp
或 udp
。如果未指定協(xié)議,則默認(rèn)為 tcp
。
11. ENTRYPOINT
ENTRYPOINT
是 Dockerfile 中的一條指令,用于配置容器啟動時執(zhí)行的命令。與 CMD
不同,ENTRYPOINT
指令設(shè)置的命令不會被 Docker 命令行中的 docker run
中的命令覆蓋,而是會作為容器的主要命令執(zhí)行。
ENTRYPOINT ["executable", "param1", "param2"]
比如:
ENTRYPOINT nginx -g 'daemon off;'
12. VOLUME
用于創(chuàng)建一個掛載點,并將該掛載點中的數(shù)據(jù)持久化保存。
VOLUME ["<路徑>","<路徑>","<路徑>"……]
其中 <路徑>
是要掛載的目錄路徑。該目錄路徑可以是絕對路徑,也可以是相對于容器內(nèi)文件系統(tǒng)的路徑。
比如:
VOLUME ["/var/log", "/var/db"]
到此這篇關(guān)于Dockerfile制作鏡像的常用指令詳解的文章就介紹到這了,更多相關(guān)Dockerfile制作鏡像指令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker容器沒有權(quán)限寫入宿主機目錄的解決方案
這篇文章主要介紹了Docker容器沒有權(quán)限寫入宿主機目錄的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03docker-compose+nginx部署前后端分離的項目實踐
本文主要介紹了docker-compose?+?nginx部署前后端分離的項目,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03Spring Boot應(yīng)用通過Docker發(fā)布部署的流程分析
將Spring Boot項目部署到docker中有兩種方法,手動部署和插件部署,本文通過實例代碼介紹了idea創(chuàng)建spring boot項目的詳細(xì)過程,感興趣的朋友一起看看吧2021-09-09Docker下安裝部署Clickhouse及其遠(yuǎn)程訪問方式
文章介紹了如何遠(yuǎn)程拉取和安裝ClickHouse Docker鏡像,配置和部署ClickHouse容器,并通過DataGrip遠(yuǎn)程訪問ClickHouse2024-11-11Docker遠(yuǎn)程連接設(shè)置的實現(xiàn)示例
本文主要介紹了Docker遠(yuǎn)程連接設(shè)置的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03docker compose安裝es+kibana 8.12.2的詳細(xì)過程
因云平臺需要改造,es7升級為es8,所以記錄一下,es8需要開啟ssl認(rèn)證,需要配置證書,全本帶你用docker安裝,便于后面es8的學(xué)習(xí),這篇文章主要介紹了docker compose安裝es+kibana 8.12.2的詳細(xì)過程,感興趣的朋友跟隨小編一起看看吧2024-05-05