鏡像命名規(guī)范與Dockerfile編寫規(guī)范

小鯨魚,大本領(lǐng)

鏡像命名規(guī)范

鏡像地址:鏡像倉庫/項(xiàng)目名/鏡像名:標(biāo)簽名

  1. 項(xiàng)目名,公共項(xiàng)目使用名稱:base,并設(shè)置為公開;其它項(xiàng)目使用英文小寫項(xiàng)目名,設(shè)置為私有。
  2. 鏡像名中應(yīng)該包含使用的組件名稱及版本信息,使用-連接。
    • 基礎(chǔ)鏡像命名規(guī)則
      基礎(chǔ)鏡像命名應(yīng)按照操作系統(tǒng)大版本:版本號-構(gòu)建版本的格式命名,例如:base/rehl7:7.6-1
    • 公共鏡像全名規(guī)則
      公共鏡像命名應(yīng)按照服務(wù)名-中間件-上級中間件:服務(wù)版本號-中間件
      版本號-上級中間件版本號-構(gòu)建版本的格式命名,中間件名稱可以包含大版本號,例如:base/tomcat8-openjdk8:8.5.23-jre8u212-1
    • 應(yīng)用命名規(guī)則
      使用格式:系統(tǒng)-模塊:系統(tǒng)版本-模塊版本-構(gòu)建版本,例如:sys/sys-rs:1.1-1.1-1
  3. 同一應(yīng)用鏡像在以上標(biāo)簽的規(guī)則下,還可以根據(jù)發(fā)布流程設(shè)置多個標(biāo)簽,以滿足部署時版本依賴的管理要求。例如sys/sys-rs:v1代表v1.x的最新版本。

鏡像制作規(guī)范

  1. 關(guān)鍵字使用大寫
  2. FROM鏡像,指定明確的Tag,不要使用latest
  3. 發(fā)布向后兼容的鏡像可以使用同一個Tag號,否則使用新的Tag號
  4. 盡量將命令放在同一個RUN命令下,減少層數(shù)
  5. 鏡像中避免多進(jìn)程,如果一定要使用,請引入tini命令,用來管理進(jìn)程
RUN yum install tini -y && yum clean all -y
ENTRYPOINT ['tini', '--']
  1. 盡量使用exec,使真正應(yīng)用的進(jìn)程ID為1
  2. 清理臨時文件,如yum install后需要執(zhí)行yum clean all -y
  3. 優(yōu)化Dockerfile命令的順序,盡量把不變的放在前面
  4. 使用WORKDIR指定工作目錄,避免絕對路徑擴(kuò)散
  5. 使用 set -o pipefail 避免管道錯誤被忽略
RUN set -o pipefail && wget -O - https://some.site | wc -l > /number 
  1. 優(yōu)先使用COPY,比ADD更簡單明了
  2. 始終暴露重要端口
  3. 習(xí)慣使用環(huán)境變量,同時在Dockerfile中為環(huán)境變量設(shè)置默認(rèn)值
ENV APP_PORT=8761
  1. 避免設(shè)置默認(rèn)密碼
  2. 鏡像中不要安裝sshd
  3. 使用volume顯示設(shè)置掛載點(diǎn),以方便鏡像的使用者知道需要如何定義存儲卷
  4. 支持任一用戶運(yùn)行,對于需要訪問的目錄文件執(zhí)行以下命令更新權(quán)限
RUN chgrp -R 0 /some/directory && \
    chmod -R g+rwX /some/directory

Dockerfile的最后使用USER指定數(shù)字用戶

USER 1001
  1. 容器內(nèi)部應(yīng)用使用Service訪問k8s/OCP平臺的其他服務(wù)。
  2. 應(yīng)用基礎(chǔ)鏡像應(yīng)該安裝公用的依賴庫
  3. 為鏡像設(shè)置元數(shù)據(jù),例如說明鏡像的用途等,UI界面可以根據(jù)這些元數(shù)據(jù)進(jìn)行定制功能
LABEL io.openshift.tags="mongodb,mongodb24,nosql" \
      io.openshift.min-memory="8Gi" \
      io.openshift.min-cpu"=4" \
      io.openshift.non-scalable"=true" \
      io.k8s.description="The MySQL 5.5 Server with master-slave replication support" \
      io.openshift.wants="mongodb,redis"
  1. 盡量將應(yīng)用的日志以標(biāo)準(zhǔn)輸出的形式輸出,這樣可以被容器平臺統(tǒng)一收集管理。
  2. 鏡像中為應(yīng)用準(zhǔn)備好健康檢查的探針,方便容器平臺對應(yīng)用進(jìn)行健康檢查。

下圖為使用EXEC格式與SHELL格式,執(zhí)行ENTRYPOINT CMD的區(qū)別。

使用`EXEC`格式與`SHELL`格式,執(zhí)行ENTRYPOINT CMD的區(qū)別

OpenShift官方文檔——鏡像構(gòu)建規(guī)范
Dockerfile最佳實(shí)踐
ENTRYPOINT 入口點(diǎn)
dockerfile最佳實(shí)踐
常用的Dockerfile鏡像地址
nginx的Dockerfile實(shí)例:把日志輸出到標(biāo)準(zhǔn)輸出

RUN ln -sf /dev/stdout /var/log/nginx/access.log \
    && ln -sf /dev/stderr /var/log/nginx/error.log
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。