一些常見的精簡Docker?file規(guī)則總結(jié)
前言
在編寫 Dockerfile 時(shí),精簡規(guī)則不僅有助于減小鏡像大小,還能提高構(gòu)建速度和可維護(hù)性。以下是一些常見的精簡 Dockerfile 規(guī)則:
1. 盡量合并 RUN 指令
每個(gè) RUN
指令會(huì)產(chǎn)生一個(gè)新的鏡像層,因此多個(gè)命令可以合并為一個(gè) RUN
指令,減少鏡像層數(shù)。
不推薦:
RUN yum -y update RUN yum -y install nginx RUN yum clean all
推薦:
RUN yum -y update && \ yum -y install nginx && \ yum clean all
2. 使用 && 連接命令
使用 &&
連接多個(gè)命令,確保只有在前一個(gè)命令成功時(shí)才執(zhí)行后續(xù)命令,從而減少中間層。
推薦:
RUN apt-get update && apt-get install -y curl
3. 減少無關(guān)依賴
僅安裝鏡像運(yùn)行所需的最少軟件包,避免不必要的包被添加到鏡像中。例如,只安裝構(gòu)建所需的工具,構(gòu)建完成后再刪除它們。
推薦:
RUN apt-get update && apt-get install -y \ build-essential \ && rm -rf /var/lib/apt/lists/*
4. 使用 COPY 而非 ADD
COPY
是更簡單且明確定義的指令,僅用于復(fù)制文件。如果不需要解壓或下載外部資源,應(yīng)該使用 COPY
,而不是 ADD
,因?yàn)?nbsp;ADD
會(huì)自動(dòng)處理一些復(fù)雜的功能(如解壓文件)。
推薦:
COPY myfile.txt /app/myfile.txt
5. 清理臨時(shí)文件和緩存
在安裝依賴后,刪除臨時(shí)文件和緩存,減少鏡像大小。
推薦:
RUN apt-get update && apt-get install -y \ curl \ && rm -rf /var/lib/apt/lists/* \ && apt-get clean
6. 合理使用 .dockerignore
類似于 .gitignore
,使用 .dockerignore
文件忽略不必要的文件(如臨時(shí)文件、日志、構(gòu)建文件等)。這可以避免將不必要的文件包含在鏡像中,減少鏡像大小。
示例 .dockerignore
文件:
.git *.log *.md
7. 使用固定版本的基礎(chǔ)鏡像
使用固定版本(而非 latest
)的基礎(chǔ)鏡像,可以確保構(gòu)建的鏡像具有一致性和可重復(fù)性。latest
標(biāo)簽可能會(huì)在每次構(gòu)建時(shí)獲取不同版本的鏡像,導(dǎo)致不一致的行為。
推薦:
FROM ubuntu:20.04
8. 刪除無用文件
如果您在構(gòu)建過程中生成了臨時(shí)文件或不再需要的文件(例如下載的包、構(gòu)建中間文件等),請(qǐng)及時(shí)刪除它們。
推薦:
RUN curl -O https://example.com/file.tar.gz && \ tar -xzf file.tar.gz && \ rm -f file.tar.gz
9. 使用多階段構(gòu)建
使用多階段構(gòu)建來分離構(gòu)建環(huán)境和運(yùn)行環(huán)境。這樣可以將構(gòu)建所需的依賴和工具從最終鏡像中移除,減小最終鏡像的體積。
示例:
# 構(gòu)建階段 FROM node:14 AS builder WORKDIR /app COPY . . RUN npm install && npm run build # 運(yùn)行階段 FROM nginx:alpine COPY --from=builder /app/build /usr/share/nginx/html
10. 避免使用 apt-get upgrade 或 yum upgrade
避免使用 apt-get upgrade
或 yum upgrade
,因?yàn)檫@些操作會(huì)升級(jí)所有軟件包,可能會(huì)導(dǎo)致不必要的包被安裝,增加鏡像的體積。
推薦: 在安裝時(shí)只安裝所需的包,避免進(jìn)行系統(tǒng)升級(jí):
RUN yum -y install nginx
總結(jié)
通過遵循這些精簡規(guī)則,你可以確保 Dockerfile 高效、簡潔,并且能夠生成體積小、構(gòu)建速度快的鏡像。
到此這篇關(guān)于一些常見的精簡Docker file規(guī)則總結(jié)的文章就介紹到這了,更多相關(guān)docker file精簡規(guī)則內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker啟動(dòng)PostgreSQL時(shí)創(chuàng)建多個(gè)數(shù)據(jù)庫的解決方案
這篇文章主要介紹了Docker啟動(dòng)PostgreSQL時(shí)創(chuàng)建多個(gè)數(shù)據(jù)庫的解決方案,重點(diǎn)給大家介紹如何把shell/sql腳本放入/docker-entrypoint-initdb.d/目錄中,讓容器啟動(dòng)的時(shí)候自動(dòng)執(zhí)行創(chuàng)建2021-06-06docker?部署hbase并且java?Api連接的操作過程
這篇文章主要介紹了docker?部署hbase并且java?Api連接的操作過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11如何使用Docker部署Go Web應(yīng)用的實(shí)現(xiàn)
這篇文章主要介紹了如何使用Docker部署Go Web應(yīng)用的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Docker網(wǎng)絡(luò)之自定義網(wǎng)絡(luò)方式
文章介紹了Docker的網(wǎng)絡(luò)模式,包括bridge、none、container、host和用戶自定義網(wǎng)絡(luò),并詳細(xì)說明了docker0網(wǎng)絡(luò)的特點(diǎn)和自定義網(wǎng)絡(luò)的創(chuàng)建2025-01-01