Dockerfile 語法教程

Dockerfile 語法教程

文章目錄

  • Dockerfile 語法教程
  • Dockerfile 語法教程
    • 基礎概念
      • Dockerfile 簡介
      • 鏡像、容器、倉庫的概念
    • Dockerfile 基本語法
  • Dockerfile 基本語法
    • Dockerfile 的基本結構
    • 注釋的使用
    • 指令的格式
    • 指令的執行順序
  • Dockerfile 常用指令
    • FROM 指令
    • RUN 指令
    • CMD 指令
    • ENTRYPOINT 指令
    • ENV 指令
    • ARG 指令
  • 構建鏡像
    • 使用 Dockerfile 構建鏡像
    • .dockerignore 文件的使用
    • 多階段構建
  • Dockerfile 最佳實踐
    • 1. 編寫可復用的 Dockerfile
    • 2. 避免使用 root 用戶
    • 3. 優化鏡像大小

Dockerfile 語法教程

基礎概念

Dockerfile 簡介

Dockerfile 是一個文本文件,其內包含了一系列用戶可以調用docker build命令自動構建 Docker 鏡像的指令。每一條指令都會在鏡像上創建一個新的層,因此每一條指令的內容,都會作為下一次創建新的層的基礎。

鏡像、容器、倉庫的概念

  • 鏡像:Docker 鏡像是一個只讀的模板,包含了創建 Docker 容器(可以運行應用程序)和 Docker 鏡像(可以運行容器)所需的所有內容。例如,一個鏡像可能包含已安裝的應用程序、系統工具、庫和配置文件。

  • 容器:Docker 容器是鏡像的一個運行實例。您可以使用 Docker API 或 CLI 來創建、啟動、停止、移動或刪除容器。每個容器都是獨立和安全的應用平臺。

  • 倉庫:Docker 倉庫是用來存儲和管理 Docker 鏡像的地方。您可以通過 Docker Hub 或其他公開的倉庫來獲取別人共享的鏡像,也可以將自己的鏡像推送到公開或私有的倉庫中供他人使用。

Dockerfile 基本語法

Dockerfile 由一系列的指令組成,每一條指令對應一條命令。下面是一些常用的 Dockerfile 指令:

  • FROM:指定基礎鏡像。
  • RUN:在鏡像內部執行命令。
  • CMD:提供默認的命令,當容器啟動時會自動執行。
  • ENTRYPOINT:配置容器啟動時運行的命令,與 CMD 不同的是,使用 ENTRYPOINT 指定的命令不會被 shell 覆蓋,而 CMD 指定的命令會被 shell 覆蓋。
  • ENV:設置環境變量。
  • ADD/COPY:將本地文件添加到鏡像中。
  • WORKDIR:設置工作目錄。
  • EXPOSE:聲明運行時容器提供服務端口。
  • VOLUME:創建一個可以從宿主主機或其他容器掛載的掛載點,一般用來存放數據庫和需要保持的數據。

Dockerfile 基本語法

Dockerfile 的基本結構

Dockerfile 是一個文本文件,其內包含了一系列用戶可以調用 docker 命令自動構建鏡像的指令。一個基礎的 Dockerfile 文件通常包括:一個基礎鏡像信息、維護者信息、鏡像操作指令等。

# 基礎鏡像信息
FROM ubuntu:18.04
# 維護者信息
MAINTAINER Your Name <your.email@example.com>
# 鏡像操作指令
RUN apt-get update && apt-get install -y python3

注釋的使用

在 Dockerfile 中,可以使用 # 來添加注釋。單行注釋以 # 開頭,直到該行的結束。多行注釋使用 /**/ 包圍起來。

# 這是一個單行注釋
RUN echo "Hello, World!" > /tmp/hello.txt # 這是一行注釋內容/*
這是一個多行注釋
可以跨越多行
*/

指令的格式

Dockerfile 的每一行都是一個指令,格式為 instruction argument。例如,RUN 指令用于執行命令,CMD 指令用于指定容器啟動時要運行的命令。

RUN apt-get update && apt-get install -y python3 # 更新并安裝 Python3
CMD ["python3", "app.py"] # 運行 app.py 腳本

指令的執行順序

Dockerfile 中的指令按照從上到下的順序執行。用戶可以通過 docker build 命令來構建鏡像,這個過程中,Docker會按照 Dockerfile 中指令的順序來執行。

Dockerfile 常用指令

Dockerfile 是用于構建 Docker 鏡像的文本文件,它包含了一系列的指令和參數。以下是一些常用的 Dockerfile 指令:

FROM 指令

FROM 指令用于指定基礎鏡像。例如,如果我們想要基于 ubuntu:18.04 鏡像來構建我們的應用,我們可以這樣寫:

FROM ubuntu:18.04

RUN 指令

RUN 指令用于在鏡像中執行命令。例如,我們可以使用 RUN 指令來安裝一些必要的軟件包:

RUN apt-get update && apt-get install -y curl

CMD 指令

CMD 指令用于指定容器啟動時默認執行的命令。例如,我們可以使用 CMD 指令來啟動一個 web 服務器:

CMD ["service", "nginx", "start"]

ENTRYPOINT 指令

ENTRYPOINT 指令用于指定容器啟動時的入口點。與 CMD 不同的是,ENTRYPOINT 指定的命令不會被 docker run 命令后面的參數所覆蓋。例如,我們可以使用 ENTRYPOINT 指令來啟動一個 web 服務器:

ENTRYPOINT ["service", "nginx", "start"]

ENV 指令

ENV 指令用于設置環境變量。例如,我們可以使用 ENV 指令來設置數據庫連接字符串:

ENV DB_CONNECTION_STRING="server=db;user id=myuser;password=mypassword;database=mydb"

ARG 指令

ARG 指令用于定義可以在構建過程中使用的變量。例如,我們可以使用 ARG 指令來定義版本號:

ARG VERSION=1.0.0

構建鏡像

使用 Dockerfile 構建鏡像

Dockerfile 是一個文本文件,其包含了一系列用戶可以調用 docker build 命令自動執行的命令。以下是一個基本的 Dockerfile 示例:

# 使用官方 Python 運行時作為父鏡像
FROM python:3.7-slim# 設置工作目錄
WORKDIR /app# 將當前目錄內容復制到容器的 /app 目錄
ADD . /app# 使用 pip 安裝任何需要的包
RUN pip install --no-cache-dir -r requirements.txt# 使端口 80 可用于此應用程序
EXPOSE 80# 定義環境變量
ENV NAME World# 在容器啟動時運行 app.py
CMD ["python", "app.py"]

.dockerignore 文件的使用

.dockerignore 文件用于排除不需要的文件和目錄。以下是一個 .dockerignore 文件的示例:

# 忽略所有 .pyc 文件和文件夾
*.pyc
__pycache__/# 忽略所有 .log 文件和文件夾
*.log
logs/

多階段構建

多階段構建允許你將構建過程分為多個階段,每個階段都有自己的輸出。以下是一個多階段構建的示例:

# 第一階段:獲取依賴項并編譯源代碼
FROM node:14 as builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build# 第二階段:使用 Nginx 運行應用
FROM nginx:1.19-alpine as production
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Dockerfile 最佳實踐

在編寫 Dockerfile 時,遵循一些最佳實踐可以幫助我們編寫出更高效、可復用和安全的鏡像。本教程將介紹以下三個最佳實踐:編寫可復用的 Dockerfile、避免使用 root 用戶和優化鏡像大小。

1. 編寫可復用的 Dockerfile

為了提高開發效率,我們可以編寫一個通用的 Dockerfile,然后在需要的時候繼承它。這樣可以避免重復編寫相同的基礎設置。例如,我們可以創建一個名為 base 的 Dockerfile,包含所有通用設置,然后在其他 Dockerfile 中通過 FROM base 指令繼承它。

# base Dockerfile
FROM alpine:latest
RUN apk update && apk add --no-cache git
WORKDIR /app

在其他 Dockerfile 中,我們可以這樣繼承 base Dockerfile:

# app Dockerfile
FROM base
COPY . /app
RUN make build
CMD ["./app"]

2. 避免使用 root 用戶

在容器中以 root 用戶身份運行進程可能會導致安全風險。因此,建議在容器中以非 root 用戶身份運行進程。可以通過以下方式實現:

  1. 在 Dockerfile 中使用 USER 指令切換到非 root 用戶。
  2. 確保應用程序在運行時以非 root 用戶身份運行。

例如,我們可以在 base Dockerfile 中添加以下內容:

USER nobody

然后,在需要使用非 root 用戶的應用程序的 Dockerfile 中,確保應用程序以非 root 用戶身份運行。例如:

# app Dockerfile
FROM base
COPY . /app
RUN chown -R nobody:nobody /app && make build
USER nobody
CMD ["./app"]

3. 優化鏡像大小

為了減少鏡像的大小,我們可以采取以下措施:

  1. 使用多階段構建。多階段構建可以將多個構建階段合并到一個鏡像中,從而減少層數和大小。例如:
# multi-stage build example
FROM node:14 as builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run buildFROM alpine:latest as production
WORKDIR /app
COPY --from=builder /app/build ./build
CMD ["./build"]
  1. 清理不必要的文件。在構建過程中,可能會生成一些臨時文件或緩存文件。可以使用 RUN 指令刪除這些文件,以減小鏡像大小。例如:
# remove unnecessary files example
RUN apk del gcc musl-dev && rm -rf /var/cache/apk/* && adduser -D user && mkdir -p /home/user/app && chown -R user:user /home/user/app && mv /app/* /home/user/app/ && rm -rf /app/* && chown -R user:user /home/user/app && mv /home/user/app/* /app/ && rm -rf /home/user/app/* && rm -rf /var/cache/apk/* && rm -rf /tmp/* && apk update && apk add --no-cache libc6-compat && apk add --no-cache libstdc++6 && apk add --no-cache zlib && apk add --no-cache libgcc-s.so.1 && apk add --no-cache libssl1.1 && apk add --no-cache libffi-dev && apk add --no-cache openssl-dev && apk add --no-cache python3 && apk add --no-cache py3-pip && pip3 install --upgrade pip setuptools wheel && pip3 install uwsgi==2.0.19 && pip3 install psutil==5.7.0 && pip3 install requests==2.25.1 && pip3 install httpie==1.0.3 && pip3 install boto3==1.16.48 && pip3 install botocore==1.19.48 && pip3 install cryptography==3.4.7 && pip3 install grpcio==1.34.0 && pip3 install google-api-python-client==1.7.12 && pip3 install google-auth==1.23.0 && pip3 install google-auth-httplib2==0.0.4 && pip3 install google-cloud-core==1.4.1 && pip3 install google-resumable-media==0.5.2 && pip3 install idna==2.10 && pip3 install PyNaCl==1.4.0 && pip3 install six==1.15.0 && pip3 install twilio==6.64.0 && pip3 install validate-email==2020.10.26 && rm -rf /var/cache/apk/* && apk del gcc musl-dev python3 py3-pip build-base && adduser -D user && mkdir -p /home/user/app && chown -R user:user /home/user/app && mv /app/* /home/user/app/ && rm -rf /app/* && chown -R user:user /home/user/app && mv /home/user/app/* /app/ && rm -rf /home/user/app/* && apk update && apk add --no-cache libc6-compat libstdc++6 zlib libgcc-s.so.1 libssl1.1 libffi-dev openssl-dev python3 py3-pip build-base uwsgi==2.0.19 psutil==5.7.0 requests==2.25.1 httpie==1.0.3 boto3==1.16.48 botocore==1.19.48 cryptography==3.4.7 grpcio==1.34.0 google-api-python-client==1.7.12 google-auth==1.23.0 google-auth-httplib2==0.0

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714956.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714956.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714956.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鴻蒙崗位需求突增!移動端、PC端、IoT到底該怎么選?

“2024年是原生鴻蒙的關鍵一年&#xff0c;我們要加快推進各類鴻蒙原生應用的開發&#xff0c;集中打贏技術底座和三方生態兩大最艱巨的戰斗。”這是余承東在新年信中表達的決心。 隨后在1月18日舉行的鴻蒙生態千帆啟航儀式上&#xff0c;華為宣布 HarmonyOS NEXT 鴻蒙星河版系…

當開發人員無法解決問題時,測試人員應該如何與他們溝通?

當開發人員無法解決問題時&#xff0c;測試人員可以采取以下方式進行溝通&#xff1a; 保持耐心和理解&#xff1a;意識到解決問題可能需要時間和努力&#xff0c;避免對開發人員施加過度壓力。提供更多信息和細節&#xff1a;檢查是否有其他相關信息或細節可以提供給開發人員…

Codeforces Round 929 (Div. 3)---->E. Turtle vs. Rabbit Race: Optimal Trainings

一&#xff0c;思路&#xff1a; 1&#xff0c;做這題如果對二分敏感的話&#xff0c;看完題目就大概很容易想到&#xff0c;通過二分來找到一個 r ,使得 [ l, r] 之間的和最接近 u (因為這樣才是 Isaac 所能獲得的最大提升)。 2&#xff0c;還有一個特殊情況&#xff0c;結合…

MobiLlama: Towards Accurate and Lightweight Fully Transparent GPT

論文的主要目的是設計一個準確且高效的小型語言模型&#xff08;SLM&#xff09;&#xff0c;以滿足資源受限設備的需求。以下是根據論文內容整理的要點&#xff1a; 背景與挑戰&#xff1a; 大型語言模型&#xff08;LLMs&#xff09;在處理復雜任務時表現出色&#xff0c;但它…

Linux下進程相關概念詳解

目錄 一、操作系統 概念 設計操作系統的目的 定位 如何理解“管理” 系統調用和庫函數概念 二、進程 概念 描述進程—PCB&#xff08;process control block&#xff09; 查看進程 進程狀態 進程優先級 三、其它的進程概念 一、操作系統 概念 任何計算機系統都包…

【Easyx】easyx從入門到精通 — 初步入門

easyx 初步入門 1 安裝easyx圖形庫2 如何使用Easyx3 效果初試4 基本圖形繪制4.1 繪制點4.2 繪制直線4.3 繪制圓形4.4 繪制矩形4.5 繪制橢圓4.6 繪制圓角矩形4.7 繪制扇形 Thanks?(&#xff65;ω&#xff65;)&#xff89;謝謝閱讀&#xff01;&#xff01;&#xff01;下一篇…

Java學習—字符流

在 Java 中&#xff0c;字符流主要用于處理字符數據&#xff0c;比如文本文件。字符流直接以字符為單位進行讀寫操作&#xff0c;自動處理字符與底層字節之間的轉換&#xff0c;因此非常適合處理包含文本數據的文件。Java 中處理字符流的核心抽象類是 Reader 和 Writer。 Read…

C#面:是否可以從一個 static 方法內部發出對非 static 方法的調用

不可以&#xff1b; 不能直接從一個靜態方法內部調用非靜態方法。 這是因為靜態方法是屬于類的&#xff0c;而非靜態方法是屬于類的實例的。 靜態方法可以在沒有創建類的實例的情況下被調用&#xff0c;而非靜態方法需要通過類的實例來調用。 如果想要從靜態方法內部調用非…

算法入門-二分搜索(長期更新)

文章目錄 情景一 : 二分查找情景二 : 找出一個 > num 的最左側的位置情景三 : 找出一個 < num 的最右側的位置leetcode 162 :尋找峰值leetcode 69 : x 的平方根 首先來簡介一下二分搜索算法,二分搜索是一種每次砍半的算法,最經典的案例當然是我們的二分查找算法,但是大部…

【JAVA重要知識 | 第一篇】一篇文章讀懂HashMap(存儲、擴容、初始化過程)

文章目錄 1.一篇文章讀懂HashMap&#xff08;存儲、擴容、初始化過程&#xff09;1.1HashMap簡介1.1.1特點1.1.2優點1.1.3缺點 1.2深入解讀HashMap1.2.1常用常量和變量&#xff08;1&#xff09;常用常量&#xff08;2&#xff09;常用變量 1.2.2存儲過程&#xff08;1&#xf…

診所門診電子處方軟件操作教程及試用版下載,醫務室處方箋管理系統模板教程

診所門診電子處方軟件操作教程及試用版下載&#xff0c;醫務室處方箋管理系統模板教程 一、前言 以下軟件程序教程以 佳易王診所電子處方軟件V17.0為例說明 軟件文件下載可以點擊最下方官網卡片——軟件下載——試用版軟件下載 如上圖&#xff0c;點擊基本信息設置——處方配…

Acwing---1208. 翻硬幣

翻硬幣 1.題目2.基本思想3.代碼實現 1.題目 小明正在玩一個“翻硬幣”的游戲。 桌上放著排成一排的若干硬幣。我們用 * 表示正面&#xff0c;用 o 表示反&#xff08;是小寫字母&#xff0c;不是零&#xff09;。 比如&#xff0c;可能情形是&#xff1a;**oo***oooo 如果同…

Python編程小案例—利用flask查詢本機IP歸屬并輸出網頁圖片

Python編程小案例—利用flask查詢本機IP歸屬并輸出網頁圖片 環境&#xff1a;Pycharm Mac OS 源碼如下&#xff1a; from flask import Flask, render_template, requestapp Flask(__name__)app.route(/) def index():return render_template(IP查詢.html)if __name__ __…

文心一言 Python編程之

給一個包含n個整數的數組nums&#xff0c;判斷nums中是否存在三個元素a,b,c&#xff0c;使得abc0?請你找出所有和為0且不重復的三元組。 注意&#xff1a;答案中不可以包含重復的三元組。 示例1&#xff1a; 輸入&#xff1a;nums[-1,0,1,2,-1,-4] 輸出&#xff1a;[[-1,-1,2…

中介者模式

定義&#xff1a;中介者模式&#xff08;Mediator Pattern&#xff09;又稱為調節者模式或調停者模式。用一個中介對象封裝一系列的對象交互&#xff0c;中介者使各對象不需要顯式的相互作用&#xff0c;從而使其耦合松散&#xff0c;而且可以獨立地改變它們之間的交互。 適用…

如何正確選擇一臺大路燈?2024五大出眾品牌大路燈推薦,附超全科普知識整理

大路燈的使用操作非常簡便&#xff0c;而且能夠提供最適合目前用眼的光線環境。但如今市場中卻有一些劣質大路燈&#xff0c;它們的使用體驗不佳&#xff0c;很多客戶反饋說可能會出現光線不穩定、刺眼等問題&#xff0c;甚至會有讓用戶有損傷視力的風險。那么如何選擇一臺大路…

華碩ROG玩家國度幻16air 2024原裝系統恢復安裝教程方法

華碩ROG玩家國度幻16air 2024原裝系統恢復安裝教程方法 重建ASUSRECOVERY恢復功能 支持型號&#xff1a; GU605MI&#xff0c;GU605MY&#xff0c;GU605MZ GU605MV&#xff0c;GU605MU 分3種安裝方法 遠程恢復安裝&#xff1a;https://pan.baidu.com/s/166gtt2okmMmuPUL1…

Spring對IoC的實現

個人名片&#xff1a; &#x1f43c;作者簡介&#xff1a;一名大三在校生&#xff0c;喜歡AI編程&#x1f38b; &#x1f43b;???個人主頁&#x1f947;&#xff1a;落798. &#x1f43c;個人WeChat&#xff1a;hmmwx53 &#x1f54a;?系列專欄&#xff1a;&#x1f5bc;?…

Qt使用QSettings類來讀寫ini

在Qt中&#xff0c;可以使用QSettings類來讀寫ini文件。QSettings提供了一個簡單的接口&#xff0c;用于訪問和修改ini文件中的鍵值對。 下面是使用QSettings類來寫入ini文件的示例代碼&#xff1a; #include <QCoreApplication> #include <QSettings>int main(i…