[筆記]實作restful api with Dockerized QPKG (使用Python restframework) — — Dockerfile 部份

R. H.
hobo engineer
Published in
4 min readDec 21, 2018

記錄實做一個簡單的 restful api , 且於docker container上執行 , 最後包裝成QPKG , 能於 Qnap Nas App Center 中執行 .

主要步驟大約分為 :
1. 建立 restful api
2. 撰寫 Dockerfile
3. 包裝QPKG

建立 restful api 的部份先略過不提 , 在此主要紀錄後續如何包裝成 Dockerized QPKG 的部份

這邊是如何將 Django restful api 包在 Docker Container 執行的部份

第一步)創建一個 folder , 並建立Dockerfile 與 docker-compose.yml

mkdir rest_python
cd rest_python
touch Dockerfile
touch docker-compose.yml

第二步)將以寫好的 restful api 相關檔案搬移至此後 , 撰寫 Dockerfile

#Base images
FROM ubuntu:16.04
MAINTAINER Ricky
ENV DEBIAN_FRONTEND noninteractive
ENV PYTHONUNBUFFERED 1
RUN apt-get update \
&& apt-get install -y --no-install-recommends apt-utils \
&& apt-get install -y python3 \
&& apt-get install -y python3-pip \
&& apt-get clean
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip3 install --upgrade pip
RUN pip3 install -r requirements.txt
ADD . /code/

上述主要作用是以 ubuntu 為基底 , 接著搭載 python 環境 , 並將欲執行的相關檔案引入 container 內

第三步)撰寫 docker-compose.yml

version: '2'
services:
web:
build: .
command: ["sh", "runserver.sh"]
restart: always

# (HOST:CONTAINER)
ports:
- "9000:9000"

這邊主要描述是以 web container 呼叫相同路徑下的 Dockerfile
並對外開啟 port 9000

而這邊有個比較容易踩雷的地方是 command 的部份

command 能設定 web container 啟動後所需執行的指令
但若所需執行的 command 不只一行

ex. 
command: ["Do","Something","A"]
command: ["Do","Something","B"]

它預設只會執行最後一句

command: ["Do","Something","B"]

所以以此為例 , 當 web container 啟動後 , 所掛載的 Django restful api 程式
需要執行 migrate 以更新資料庫 , runserver 等等動作 , 就可另外開個 shell 檔去執行會比較方便

touch runserver.sh

runserver.sh

python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py runserver 0.0.0.0:9000

這邊呼應先前 web container 設定對外開啟的 port 9000
故一樣 runserver 在 port 9000

第四步) 執行

docker-compose up

成功以 docker container 環境執行 restful api 於 本機端 port 9000

--

--