認真!Dockerfile本身是由一行行命令句所組成,並支援以#
開頭的註解行
本身Dockerfile區分為四個部份:
FROM
ubuntu >> 基本映像檔,必須要先參照指定的基底而跑的指令MAINTAINER
Gary mosbbs2@gmail.com >> 維護人員(建議但非必要)RUN
apt-get update && apt-get install -y nginx >> 更新映像檔指令RUN
echo "\ndaemon off;" >> /etc/nginx/nginx.confCMD
/usr/sbin/nginx >> 建立新容器所需執行的指令
當然實際上遠比現行的範例複雜多的多,但至少透過簡單的示範讓初學者可以慢慢進入狀況不在認為遙不可及,以下是更多的指令動作來搭配組合一個更完整的dockerfile來實踐更多樣的自動化動作。
exec
執行。/bin/sh
中執行,使用在給需要互動的指令。key=value
形式來定義。你可以用LABEL記錄一些映像檔資訊如:版本號、作者等訊息。官方建議用LABEL來定義多組識別提高效率。Container在執行時需要監聽哪個port
。EXPOSE本身並非直接開放port給外部存取,要在docker run啟動容器時需要透過 -P,Docker會在分配一個埠轉發到指定的埠。WORKDIR
:會將指定的目錄設定為當前的工作目錄。Use an official Python runtime as a parent image
FROM python:3.7.3-stretch
Set the working directory to /app
Install any needed packages specified in requirements.txt
COPY requirements.txt ./
COPY gunicorn.py ./
ADD
可作為COPY加強版本,允許Source Path是一個URL,假設下載的是壓縮檔則會自動解壓縮。RUN pip install --trusted-host pypi.python.org -r requirements.txt \
&& python3 -O -m compileall -b ./app \
&& find ./app -name "*.py"|xargs rm -rf \
&& python3 -O -m compileall -b ./config.py \
&& rm ./config.py
Make port 5000 available to the world outside this container
EXPOSE 5000
-p <host port>:<container port>
是把兩邊的連接埠做映射,而宣告容器使用哪個連接埠並不會自動映射到主機上。Define environment variable
ENV NAME World
Run app.py when the container launches
CMD ["gunicorn", "-c", "gunicorn.py", "run:app"]