Dockerfile

来源:https://www.cnblogs.com/tushanbu/archive/2022/08/30/16640875.html
-Advertisement-
Play Games

Dockerfile 基本結構 Dockerfile 是一個文本格式的配置文件,用戶可以使用 Dockerfile 快速創建自定義鏡像。 Dockerfile 由一行行命令語句組成,並且支持以 # 開頭的註釋行。 Docker分為四部分: 基礎鏡像信息 維護者信息 鏡像操作指令 容器啟動時預設要執行 ...


Dockerfile


目錄

基本結構

Dockerfile 是一個文本格式的配置文件,用戶可以使用 Dockerfile 快速創建自定義鏡像。

Dockerfile 由一行行命令語句組成,並且支持以 # 開頭的註釋行。

Docker分為四部分:

基礎鏡像信息
維護者信息
鏡像操作指令
容器啟動時預設要執行的指令
例如:

# 第一行必須指定基於的基礎鏡像
FROM centos
# 維護者信息
LABEL MANTAINER "lvnanhai66 [email protected]"
# 鏡像操作指令
RUN  useradd -r -M -s /sbin/nologin apache 
# 容器啟動時預設要執行的指令
CMD ["/usr/local/apache/bin/httpd","-D","FOREGROUND"]

其中,一開始必須指明所基於的鏡像名稱,接下來一般會說明維護者信息。
後面則是鏡像操作指令,例如RUN指令,RUN指令將對鏡像執行跟隨的命令。每運行一條RUN指令,鏡像添加新的一層,並提交。
最後是CMD指令來指定運行容器時的操作指令。

指令

指令的一般格式為INSTRUCTION arguments,指令包括:

FROM
LABEL MAINTAINER
RUN
CMD
EXPOSE
ENV
ADD
COPY
ENTRYPOINT
VOLUME
USER
WORKDIR
ONBUILD

FROM
功能為指定基礎鏡像,並且必須是第一條指令。

如果不以任何鏡像為基礎,那麼寫法為:FROM scratch。

同時意味著接下來所寫的指令將作為鏡像的第一層開始

FROM centos    //基於centos的鏡像
語法:
FROM <image>
FROM <image>:<tag>
FROM <image>:<digest>
三種選項,其中<tag>和<digest>是可選項,如果沒有選擇那麼預設就是latest

LABEL MAINTAINER
指定維護者信息

語法:LABEL MAINTAINER <name email_address>
LABEL MANTAINER "lvnanhai66 [email protected]"

RUN
功能為運行指定的命令
RUN命令有兩種格式
1.RUN command
2.RUN ["executable", "param1", "param2"]
前者將在shell終端中運行命令,即/bin/sh -c;後者則使用exec執行。指定使用其他終端可以通過第二種方式實現,例如:RUN ["/bin/bash","-c","echo hello"]
每條RUN指令將在當前鏡像基礎上執行指定命令,並提交為新的鏡像。當命令較長時可以使用 \ 來換行

[root@localhost ~]# cd httpd/
[root@localhost httpd]# ls
Dockerfile  files
[root@localhost httpd]# vim Dockerfile 
[root@localhost httpd]# cat Dockerfile 
FROM busybox

LABEL MANTAINER "lvnanhai66 [email protected]"

RUN echo "hello lnh" > /tmp/abc
[root@localhost httpd]#  podman build -t httpd:1.0 .
STEP 1/3: FROM busybox
STEP 2/3: LABEL MANTAINER "lvnanhai66 [email protected]"
--> d761206551e
STEP 3/3: RUN echo "hello lnh" > /tmp/abc
COMMIT httpd:1.0
--> 80125d342c8
Successfully tagged localhost/httpd:1.0
80125d342c8d86708b7c9a572ea46876a361a2c6a6b21c6b4ad66c4c00dd0b37
[root@localhost httpd]# podman run -it --rm httpd:1.0 /bin/sh
/ # cd /tmp/
/tmp # ls
abc

CMD

CMD支持三種格式:
1.CMD ["executable","param1","param2"]使用exec執行,推薦方式
2.CMD command param1 param2在/bin/sh中執行,提供給需要交互的應用
3.CMD ["param1","param2"]提供給ENTRYPOINT的預設參數
CMD用於指定啟動容器時預設要執行的命令,每個Dockerfile只能有一條CMD命令。如果指定了多條命令,只有最後一條會被執行。

如果用戶啟動容器時指定了運行的命令,則會覆蓋掉CMD指定的命令。

不要把RUN和CMD搞混了。

RUN是構件容器時就運行的命令以及提交運行結果

CMD是容器啟動時執行的命令,在構件時並不運行,構件時緊緊指定了這個命令到底是個什麼樣子

CMD ["/usr/local/apache/bin/httpd","-D","FOREGROUND"]

EXPOSE

格式為EXPOSE port [port...]。
例如:

EXPOSE 22 80 8443
EXPOSE用於告訴Docker伺服器容器暴露的埠號,供互聯繫統使用。

在啟動容器時通過-P,Docker主機會自動分配一個埠轉發到指定的埠;
使用-p則可以具體指定哪個本地埠映射過來。

ENV
格式為ENV key value 。指定一個環境變數,會被後續RUN指令使用,併在容器運行時保持。

ENV PATH /usr/local/apache/bin:$PATH   //配置環境變數

ADD
格式為ADD src dest
該命令將複製指定的src到容器中的dest。其中src可以是Dockerfile所在目錄的一個相對路徑(文件或目錄);也可以是一個URL;還可以是一個tar文件(會自動解壓為目錄)。

[root@localhost httpd]# ls
Dockerfile  files
[root@localhost httpd]# ls files/
apr-1.7.0.tar.gz  apr-util-1.6.1.tar.gz  entrypoint.sh  httpd-2.4.54.tar.gz
[root@localhost httpd]# vim Dockerfile 
[root@localhost httpd]# cat Dockerfile 
FROM busybox

ADD files/apr-1.7.0.tar.gz /tmp/
[root@localhost httpd]#  podman build -t httpd:2.0 .
STEP 1/2: FROM busybox
STEP 2/2: ADD files/apr-1.7.0.tar.gz /tmp/
COMMIT httpd:2.0
--> 5a9f6d599dc
Successfully tagged localhost/httpd:2.0
5a9f6d599dc3245e3bfba5877bd84f155d9410e1fff6a679a8ebab954f530f1a
[root@localhost httpd]#  podman run -it --rm  httpd:2.0 /bin/sh
/ # cd tmp/
/tmp # ls
apr-1.7.0
/tmp #

COPY

格式為COPY <src> <dest>。

複製本地主機的<src>(為Dockerfile所在目錄的相對路徑,文件或目錄)為容器中的<dest>。目標路徑不存在時會自動創建。
當使用本地目錄為源目錄時,推薦使用COPY。

ENTRYPOINT
ENTRYPOINT有兩種格式:

ENTRYPOINT ["executable","param1","param2"]
ENTRYPOINT command param1 param2(在shell中執行)
配置容器啟動後執行的命令,並且不可被docker run提供的參數覆蓋。而且,如果在docker run的後面提供了參數,這些命令行參數會被當作參數傳遞給ENTRYPOINT指定的程式。

每個Dockerfile中只能有一個ENTRYPOINT,當指定多個ENTRYPOINT時,只有最後一個生效。

例如:ENTRYPOINT ["/bin/bash","/entrypoint.sh"]

VOLUME

格式為VOLUME ["/data"]。

創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放資料庫和需要保持的數據等

USER
格式為USER daemon。

指定運行容器時的用戶名或UID,後續的RUN也會使用指定用戶。

當服務不需要管理員許可權時,可以通過該命令指定運行用戶。並且可以在之前創建所需要的用戶,例如:

RUN groupadd -r postgres && useradd -r -g postgres postgres

要臨時獲取管理員許可權可以使用gosu,而不推薦sudo。如果不指定,容器預設是root運行。

WORKDIR
語法:

WORKDIR /path/to/workdir

設置工作目錄,對RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在則會創建,也可以設置多次。
如:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

pwd執行的結果是/a/b/c

WORKDIR也可以解析環境變數

如:

ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd

pwd的執行結果是/path/$DIRNAME

ONBUILD
格式為ONBUILD [INSTRUCTION]。

配置當所創建的鏡像作為其他鏡像的基礎鏡像時,所執行的操作指令。

例如,Dockerfile使用如下的內容創建了鏡像image-A

[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]

此時,如果基於image-A創建新的鏡像時,新的Dockerfile中使用FROM image-A指定基礎鏡像時,會自動執行ONBUILD指令的內容,等價於在後面添加了兩條指令。

FROM image-A

# Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

使用ONBUILD指令的鏡像,推薦在標簽中註明,例如ruby:1.9-onbuild。

創建鏡像

用podman進行dockefile做一個httpd編譯安裝的鏡像,要求要控製版本號,要用到dockerfile中大部分指令及用腳本方式啟動程式,上傳到官方鏡像倉庫

[root@localhost ~]# mkdir httpd   
[root@localhost ~]# cd httpd/
[root@localhost httpd]# touch Dockerfile
[root@localhost httpd]# mkdir files
[root@localhost httpd]# ls
Dockerfile  files
//創建一個目錄,在這個目錄下麵創建一個Dockerfile文件和存放安裝包的目錄files
[root@localhost httpd]# cd files/
[root@localhost files]# wget https://downloads.apache.org/apr/apr-1.7.0.tar.gz https://downloads.apache.org/apr/apr-util-1.6.1.tar.gz https://downloads.apache.org/httpd/httpd-2.4.54.tar.gz
[root@localhost files]# ls
apr-1.7.0.tar.gz  apr-util-1.6.1.tar.gz  httpd-2.4.54.tar.gz
//下載安裝包
[root@localhost files]# vim entrypoint.sh
[root@localhost files]# cat entrypoint.sh
#!/bin/bash

sed -i '/^#ServerName/s/#//g' /usr/local/apache/conf/httpd.conf

exec "$@"
[root@localhost files]# chmod +x entrypoint.sh //賦予腳本執行許可權
[root@localhost files]# ll
total 11136
-rw-r--r--. 1 root root 1093896 Apr  5  2019 apr-1.7.0.tar.gz
-rw-r--r--. 1 root root  554301 Oct 23  2017 apr-util-1.6.1.tar.gz
-rwxr-xr-x. 1 root root      88 Aug 30 16:43 entrypoint.sh
-rw-r--r--. 1 root root 9743277 Jun  8 16:42 httpd-2.4.54.tar.gz
//寫一個腳本作為啟動程式
[root@localhost files]# cd ..
[root@localhost httpd]# ls
Dockerfile  files
[root@localhost httpd]# vim Dockerfile 
[root@localhost httpd]# cat Dockerfile 
FROM centos

LABEL MANTAINER "lvnanhai66 [email protected]"
ENV apache_version 2.4.54     //apache版本號
ENV PATH /usr/local/apache/bin:$PATH   //配置環境變數

ADD files/apr-1.7.0.tar.gz /usr/src/
ADD files/apr-util-1.6.1.tar.gz /usr/src/
ADD files/httpd-${apache_version}.tar.gz /usr/src/   //這樣可以更換
ADD files/entrypoint.sh /     //將這個腳本放到根下麵
 
RUN  useradd -r -M -s /sbin/nologin apache && \
     cd /etc/yum.repos.d && rm -r * && \
     curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo  && \
     sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo  && \
     yum clean all  && yum makecache && \
     yum -y install gcc gcc-c++ make openssl-devel pcre-devel expat-devel libtool && \
     cd /usr/src/apr-1.7.0 && \
     sed -i '/$RM "$cfgfile"/d' configure && \
     ./configure --prefix=/usr/local/apr && \
     make && make install && \
     cd ../apr-util-1.6.1 && \
     ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr  && \
     make && make install && \
     cd ../httpd-${apache_version}  && \
     ./configure --prefix=/usr/local/apache \
        --enable-so \
        --enable-ssl \
        --enable-cgi \
        --enable-rewrite \
        --with-zlib \
        --with-pcre \
        --with-apr=/usr/local/apr \
        --with-apr-util=/usr/local/apr-util/ \
        --enable-modules=most \
        --enable-mpms-shared=all \
        --with-mpm=prefork  && \
     make  && make install  && \
     yum clean all && \       //清除緩存
     yum -y remove gcc gcc-c++ make && \    //這些編譯工具可以清除
     rm -rf /tmp/* /usr/src/*    //這個下麵的文件可以清除
 
EXPOSE 80       //映射的埠號
WORKDIR /usr/local/apache    //相當於cd這個目錄
CMD ["/usr/local/apache/bin/httpd","-D","FOREGROUND"] //此處加了絕對路徑
ENTRYPOINT ["/bin/bash","/entrypoint.sh"]   //不知道有沒有許可權,可以直接加bin/bash
[root@localhost httpd]# podman build -t httpd:v3.0 .
....
STEP 13/13: ENTRYPOINT ["/bin/bash","/entrypoint.sh"]
COMMIT httpd:v3.0
--> f65d0bb9ee1
Successfully tagged localhost/httpd:v3.0
f65d0bb9ee17efdffdb53dc52fb92188aaa5fa1ea90cc11e2939855ba71f8ec3
讓這個鏡像運行一個容器進行測試: 
[root@localhost httpd]# podman images
REPOSITORY               TAG         IMAGE ID      CREATED             SIZE
localhost/httpd          v3.0        f65d0bb9ee17  About a minute ago  405 MB
docker.io/library/httpd  latest      dabbfbe0c57b  8 months ago        148 MB
quay.io/centos/centos    latest      300e315adb2f  21 months ago       217 MB
[root@localhost httpd]# podman run -d httpd:v3.0 
fcf786713d9b55793b997cc98e3571535b1fd4c0553409f3bb18bfd9d51fd234
[root@localhost httpd]# podman ps
CONTAINER ID  IMAGE                 COMMAND               CREATED        STATUS            PORTS       NAMES
fcf786713d9b  localhost/httpd:v3.0  /usr/local/apache...  4 seconds ago  Up 4 seconds ago              xenodochial_morse
[root@localhost httpd]# podman inspect -l |grep -i ipaddr 
//過濾查看ip
            "IPAddress": "10.88.0.6",
                    "IPAddress": "10.88.0.6",
[root@localhost httpd]# curl 10.88.0.6    //訪問成功
<html><body><h1>It works!</h1></body></html>
上傳鏡像:
[root@localhost httpd]# podman tag httpd:v3.0 docker.io/lvnanhai66/httpd:v3.0
[root@localhost httpd]# podman images
REPOSITORY                  TAG         IMAGE ID      CREATED        SIZE
localhost/httpd             v3.0        f65d0bb9ee17  8 minutes ago  405 MB
docker.io/lvnanhai66/httpd  v3.0        f65d0bb9ee17  8 minutes ago  405 MB
docker.io/library/httpd     latest      dabbfbe0c57b  8 months ago   148 MB
quay.io/centos/centos       latest      300e315adb2f  21 months ago  217 MB
[root@localhost httpd]# podman login docker.io 
Username: lvnanhai66
Password: 
Login Succeeded!
[root@localhost httpd]# podman push docker.io/lvnanhai66/httpd:v3.0
Getting image source signatures
Copying blob 3f49a2cae693 done  
Copying blob 90fc92241475 done  
Copying blob 8cfba8022d3f done  
Copying blob 34214738da46 done  
Copying blob bea1ef732da4 done  
Copying blob 2653d992f4ef done  
Copying config f65d0bb9ee done  
Writing manifest to image destination
Storing signatures

拉取自己的鏡像運行容器:
[root@localhost ~]# podman run -d --name web -P docker.io/lvnanhai66/httpd:v3.0
Trying to pull docker.io/lvnanhai66/httpd:v3.0...
Getting image source signatures
Copying blob 929704506730 skipped: already exists  
Copying blob 26ad906b0de6 done  
Copying blob c63ffcca07e0 done  
Copying blob 45fdf32689c6 done  
Copying blob 0b040dd24d11 done  
Copying blob 841f6f1ffedd done  
Copying config f65d0bb9ee done  
Writing manifest to image destination
Storing signatures
4d770508e2552c6ab554079fccf9e72ed79ed43ffcad5d6564d2cac3a07527d6
[root@localhost ~]# podman ps -a
CONTAINER ID  IMAGE                            COMMAND               CREATED        STATUS            PORTS                  NAMES
4d770508e255  docker.io/lvnanhai66/httpd:v3.0  /usr/local/apache...  8 seconds ago  Up 8 seconds ago  0.0.0.0:40607->80/tcp  web
[root@localhost ~]# podman ps 
CONTAINER ID  IMAGE                            COMMAND               CREATED         STATUS             PORTS                  NAMES
4d770508e255  docker.io/lvnanhai66/httpd:v3.0  /usr/local/apache...  19 seconds ago  Up 19 seconds ago  0.0.0.0:40607->80/tcp  web
//如果發現拉取不下來可以加加速器進行註釋(cd /etc/containers/然後vim registries.conf)

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 背景 std::format在傳參數量少於格式串所需參數數量時,會拋出異常。而在大部分的應用場景下,參數數量不一致提供編譯報錯更加合適,可以促進我們更早發現問題併進行改正。 最終效果 // 測試輸出介面。 template <typename... T> void Print(const std:: ...
  • 大家好,這篇文章主要跟大家聊下 Java 線程池面試中可能會問到的一些問題。 全程乾貨,耐心看完,你能輕鬆應對各種線程池面試。 相信各位 Javaer 在面試中或多或少肯定被問到過線程池相關問題吧,線程池是一個相對比較複雜的體系,基於此可以問出各種各樣、五花八門的問題。 若你很熟悉線程池,如果可以, ...
  • 《Python編程從入門到實踐》第2版 PDF高清版電子書免費下載地址 內容簡介 · · · · · · 本書是針對所有層次Python讀者而作的Python入門書。全書分兩部分:第一部分介紹用Python編程所必須瞭解的基本概念,包括Matplotlib等強大的Python庫和工具,以及列表、字典 ...
  • 《Python帶我起飛》——入門、進階、商業實戰PDF高清版免費下載地址 內容簡介 · · · · · · 《Python帶我起飛——入門、進階、商業實戰》針對Python 3.5 以上版本,採用“理論+實踐”的形式編寫,通過大量的實例(共42 個),全面而深入地講解“Python 基礎語法”和“P ...
  • 有沒有可能是因為你從網上下載了一些破解軟體導致的? 背景 Mac系統下JB公司家的IDEA、 Datagrip、PyCharm 或 Goland 打不開點擊沒反應…… 分析 大概率是之前安裝過 漢化插件、激活插件導致 查看方式 在 terminal 執行 /Applications/DataGrip ...
  • Dynamic CRM插件中記錄日誌的方式有多種 通常情況下分為ITracingService記錄、單獨日誌表插入記錄、文本記錄三種,本文引用Nlog實現插件中日誌記錄到文本中,並附上Nlog幫助類和伺服器Nlog.cofig配置 ...
  • 概述 本文介紹採用WPF進行3D開發的一些基礎知識,還有HelixToolkit控制項的介紹以及在MVVM模式下使用3D框架。 3D開發入門 官方文檔對3D開發的一些基礎知識已經描述的比較詳細了,地址:三維圖形概述 - WPF .NET Framework | Microsoft Docs 在學習WP ...
  • 一、項目命名 SCADA:數據採集與監控系統 SCADA(Supervisory Control And Data Acquisition),即數據採集與監視控制系統。 SCADA.Common SCADA.Main SCADA.UI SCADA.Communication SCADA.HMI SC ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...