Dockerfile是由一系列命令和參數構成的腳本,這些命令應用於基礎鏡像並最終建立一個新的鏡像。node
例子:python
FROM node:latest MAINTAINER my_name ADD ./my_project /code VOLUME ["/data1", "/data2"] WORKDIR /code RUN apt-get install mysql EXPOSE 6777 ENV SRC_URL www.xxxxxxxxxxx.com/xxxxxxx RUN wget $SRC_URL CMD ["node","bin/www"]
CMD ["executable","param1","param2"] 使用 exec 執行,推薦方式; CMD command param1 param2 在 /bin/sh 中執行,提供給須要交互的應用; CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認參數;
ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2(shell中執行)
VOLUME: 容器卷是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,將主機目錄掛在到容器裏面,能夠提供不少有用的特性:mysql
,那麼你就不再能讀取temp.data,除非你移除該數據卷。git
格式:github
USER <用戶名>
USER 指令和 WORKDIR 類似,都是改變環境狀態並影響之後的層。 WORKDIR 是改變工做目錄, USER 則是改變以後層的執行 RUN , CMD 以及 ENTRYPOINT 這類命令的身份。redis
固然,和 WORKDIR 同樣, USER 只是幫助你切換到指定用戶而已,這個用戶必須是事先創建好的,不然沒法切換。sql
RUN groupadd -r redis && useradd -r -g redis redis USER redis RUN [ "redis-server" ]
若是以 root 執行的腳本,在執行期間但願改變身份,好比但願以某個已經創建好的用戶來運行某個服務進程,不要使用 su 或者 sudo ,這些都須要比較麻煩的配置,並且在 TTY 缺失的環境下常常出錯。建議使用 gosu 。docker
# 創建 redis 用戶,並使用 gosu 換另外一個用戶執行命令 RUN groupadd -r redis && useradd -r -g redis redis # 下載 gosu RUN wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.7/ gosu-amd64" \ && chmod +x /usr/local/bin/gosu \ && gosu nobody true # 設置 CMD,並以另外的用戶執行 CMD [ "exec", "gosu", "redis", "redis-server" ]
格式: ONBUILD <其它指令> 。shell
ONBUILD 是一個特殊的指令,它後面跟的是其它指令,好比 RUN , COPY 等,而這些指令,在當前鏡像構建時並不會被執行。只有當以當前鏡像爲基礎鏡像,去構建下一級鏡像的時候纔會被執行。npm
Dockerfile 中的其它指令都是爲了定製當前鏡像而準備的,惟有 ONBUILD 是爲了幫助別人定製本身而準備的。
fundamental/Dockerfile
FROM node:slim RUN mkdir /app WORKDIR /app ONBUILD COPY ./package.json /app ONBUILD RUN [ "npm", "install" ] ONBUILD COPY . /app/ CMD [ "npm", "start" ]
project1/Dockerfile
FROM fundamental do other thing
在構建 project1 的時候 ONBUILD的命令纔會生效。
咱們將基於官方的python鏡像,搭建一個後端的環境鏡像(須要用的庫含redis、flask等)。
FROM python:3.6-alpine # 複製代碼到鏡像 ADD the_path_of_project /code # 設置後面的命令的pwd WORKDIR /code # 安裝依賴 RUN pip install redis flask # 運行服務的命令 CMD ["python", "app.py"]
例子中: