docker 筆記3 dockerfile語法及最佳實踐

青穗黃發表於2018-09-21

FROM

FROM scratch  # 製作base image
FROM centos  # 使用base image
FROM ubuntu:14.04
複製程式碼

LABEL

  • 類似程式碼註釋

RUN

RUN yum update && yum install -y vim \
    python-dev  # 反斜線換行
複製程式碼

因為每執行一次RUN,image都會生成新的一層,避免無用分層,合併多條命令成一行

WORKDIR

  • 類似cd命令,指定工作目錄
WORKDIR /root
複製程式碼

儘量使用絕對目錄

WORKDIR /test # 如果沒有會自動建立test目錄
WORKDIR demo
RUN pwd   # 輸出結果應該是 /test/demo
複製程式碼

ADD COPY 兩者類似,把本地檔案新增到docker image中 區別:ADD 不光新增到指定目錄,而且會解壓 大部分情況,COPY優於ADD 新增原創檔案/目錄,使用curl或wget

ADD hello /
複製程式碼
ADD test.tar.gz /  # 新增到根目錄並解壓
複製程式碼
WORKDIR /root
ADD hello test/  # /root/test/hello
複製程式碼

ENV 儘量使用ENV,增加可維護性

ENV MYSQL_VERSION 5.6 # 設定常量
RUN apt-get install -y mysql=server= "${MYSQL_VERSION}" \
    && RM -RF /var/lib/apt/list/*  #引用常量
複製程式碼

RUN:

  • 執行命令並建立新的Image layer

ENTRYPOINT:

  • 讓容器以應用程式或者服務的形式執行
  • 不會被忽略,一定會執行
  • 最佳實踐:寫一個shell指令碼作為entrypoint
COPY docker-entrypoint.sh /usr/local/bin
ENTRYPOINT ["docker-entrypoint.sh"]

EXPOSE 27017
CMD ["mongod"]
複製程式碼

CMD:設定容器啟動時預設執行的命令和引數

  • 如果docker run指定了其他命令,CMD命令將被忽略
  • 如果定義了多個CMD,只有最後一個會執行
FROM centos
ENV name Docker
CMD echo "hello $name"
複製程式碼

執行以上Dockerfile

$ docker run [image] # 輸出 hello Docker
$ docker run -it [image] /bin/bash # 不會輸出 hello Docker
複製程式碼

VOLUME EXPOSE

可參考docker—library 學習

相關文章