天天看點

Docker基礎教程(二)-Dockerfile指令詳解及最佳實踐(上)0 什麼是 Dockerfile?1 FROM2 LABEL3 RUN

0 什麼是 Dockerfile?

Dockerfile 是一個用來建構鏡像的文本檔案,文本内容包含了一條條建構鏡像所需的指令和說明。

1 FROM

定制的鏡像都是基于 FROM 的鏡像,後續的操作都是基于該 image。

  • FROM scratch

    制作base image

  • FROM centos

    使用base image

  • FROM ubuntu:14.04

最佳實踐

考慮安全性,請盡量使用官方 image 作為 base image。

2 LABEL

LABEL maintainer= "[email protected]'
LABEL version="1.O"
LABEL description="This is a description"      

這就像代碼的注釋,必須寫好中繼資料。

3 RUN

用于執行後面跟着的指令行指令。有以下倆種格式:

Shell格式

RUN apt-get install -y vim
CMD echo "hello docker"
ENTRYPOINT echo "hello docker"      

Dockerfile

Docker基礎教程(二)-Dockerfile指令詳解及最佳實踐(上)0 什麼是 Dockerfile?1 FROM2 LABEL3 RUN
docker build -t javaedge/centos-shell .      
Docker基礎教程(二)-Dockerfile指令詳解及最佳實踐(上)0 什麼是 Dockerfile?1 FROM2 LABEL3 RUN
docker image ls
docker run javaedge/centos-shell      
Docker基礎教程(二)-Dockerfile指令詳解及最佳實踐(上)0 什麼是 Dockerfile?1 FROM2 LABEL3 RUN
RUN <指令行指令>
# <指令行指令> 等同于,在終端操作的 shell 指令。      

Exec 格式

RUN [ "apt-get" , "install" , "-y", "vim" ]
CMD [ " /bin/echo" , "hello docker" ]
ENTRYPOINT [ "/bin/echo" , "hello docker" ]      

Dockerfile2

Docker基礎教程(二)-Dockerfile指令詳解及最佳實踐(上)0 什麼是 Dockerfile?1 FROM2 LABEL3 RUN

那如何修改才能讓 exec 格式的指令能被 shell 識别呢,修正:

Docker基礎教程(二)-Dockerfile指令詳解及最佳實踐(上)0 什麼是 Dockerfile?1 FROM2 LABEL3 RUN
RUN ["可執行檔案", "參數1", "參數2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等價于 RUN ./test.php dev offline      
RUN yum update && yum install -y vim \
    python-dev  # 反斜線換行
    
RUN apt-get update && apt-get install -y perl \
    pwgen --no-install-recommends && rm -rf \
    /var/lib/apt/lists/* # 注意清理cache
    
RUN /bin/bash -C 'source $HOME/.bashrc; echo
$HOME'      

Dockerfile 的指令每執行一次都會在 docker 上建立一層。是以過多無意義的層,會造成鏡像膨脹過大。例如:

FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上執行會建立 3 層鏡像。可簡化為以下格式:
FROM centos
RUN yum install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz      

如上,以 && 符号連接配接指令,這樣執行後,隻會建立 1 層鏡像。

  • 可讀性

    複雜RUN用反斜線換行

  • 避免無用分層

    合并多條指令成一行