# 範例 : 將 Docker-Compose 包裝成 QPKG ## 前置作業 * 安裝 QPKG * 假設專案名稱為 `DottedSign` ## 準備好 Docker Compose * 確定你的 docker-compose 跑得起來 * 重新整理 docker image * DottedSign : `docker tag 58...68.dkr.ecr.us-east-1.amazonaws.com/dottedsign:preparing kdanmobile/qnap_dotted_sign_web:1.0` * Nginx : 把 nginx:1.17.0 跟 DottedSign 的 conf 設定重新包成新的 image `kdanmobile/qnap_dotted_sign_nginx:1.0` * 建立新的 docker-compose project * 開新 project folder : `mkdir new_dotted_sign` * 修改 docker-compose.yml 使用新的 image tag * 把 docker image 壓成 tar.gz 檔 * `docker save kdanmobile/qnap_dotted_sign_web:1.0 | gzip -c > dotted_sign_web.tar.gz` * `docker save kdanmobile/qnap_dotted_sign_nginx:1.0 | gzip -c > dotted_sign_nginx.tar.gz` * 確認 folder 中只有 docker-compose.yml && 所有的 image 壓縮檔 ## 建立 QPKG 專案 * ```cd `getcfg QDK Install_Path -f /etc/config/qpkg.conf` ``` * `qbuild --create-env DottedSign` * 將產生出來的 `DottedSign` folder, 移到你想移動的位置 ## 修改專案內容 * 先進入專案資料夾 * `cd [DottedSign_path]` ### 移除無用檔案 * 把用不到的 folder 砍掉 * `rm -r arm_64/ arm-x19/ arm-x31/ arm-x41/ x86/ x86_64/ x86_ce53xx/` ### 放置你的 docker-compose * `cd shared` * `cp -r [new_dotted_sign path] docker_folder` 名稱隨意, 後面會用到 * 確保 `docker-compose up` 能夠順利執行 * 切到 docker_folder 中 * 還原 docker image * 確認 `docker-compose up -d` 正常執行 * `docker-compose down` * 砍掉 docker image ### 放置 icon * `cd [DottedSign_path]/icons` * 裡面放三張圖片 * `DottedSign.gif` : App Center 顯示的 icon, 64*64px * `DottedSign_gray.gif` : disable 版本 icon, 64*64px * `DottedSign_80.gif` : icon, 80*80px * **重點** * 注意檔名, `DottedSign` 應該是對應到 `QPKG_NAME` ### [DottedSign_path]/qpkg.cfg 修改如下 ```conf QPKG_NAME="dotted_sign" QPKG_DISPLAY_NAME="DettedSign" QPKG_VER="1.0" QPKG_AUTHOR="Kdan Mobile" # 啟動你的 qpkg 後, 要用哪個 port 及哪個 default path 連到你的服務 QPKG_WEBUI="/" QPKG_WEB_PORT=4040 # # 以下兩個為預設值不用動 QPKG_RC_NUM="101" QPKG_SERVICE_PROGRAM="dotted_sign.sh" # # 可能會需要加註 license (GPL, MIT .. .) # QPKG_LICENSE="" # # 實測過, 但不知道會顯示在哪 # QPKG_SUMMARY="The Best E-Signature Solution for Your Business" # # 當值為 1 ( default 非 1 ), 會以 popup 的方式顯示你的網頁, 而非另開分頁, 但有 iframe x-frame-options 問題 # QPKG_DESKTOP_APP=1 # 以下有一堆其他設定, 但都是註解掉的狀態 ``` * **重點** : 此檔案內容 * `QPKG_NAME` 會被其他檔案參照, 需要注意是否正確 * `QPKG_SERVICE_PROGRAM` 需要確認與 `shared/` 下的檔名一致(預設應該ok) * `QPKG_WEBUI`, `QPKG_WEB_PORT` 要看你 web application, nginx 的設定 ### [DottedSign_path]/package_routines 修改如下 ```sh QPKG_CONF=/etc/config/qpkg.conf DOCKER=$(/sbin/getcfg container-station Install_Path -f ${QPKG_CONF})/bin/system-docker image_id_from_docker_load() { # docker load will return one of: # 1. "Loaded image: nginx:1.17.0" # 2. "Loaded image ID: sha256:719cd2e...cb50105" IMAGE_ID=$(echo "$1" | sed 's/Loaded image: //g' | sed 's/Loaded image ID: sha256://g') echo $IMAGE_ID } load_docker_image() { LOAD_RESULT=$($DOCKER load < "$SYS_QPKG_DIR/docker_folder/$1") IMAGE_ID=$(image_id_from_docker_load "$LOAD_RESULT") echo $IMAGE_ID } # callback-function pkg_post_install(){ IMAGES_ID_1=$(load_docker_image "dotted_sign_nginx.tar.gz") IMAGES_ID_2=$(load_docker_image "dotted_sign_web.tar.gz") echo "$IMAGES_ID_1 $IMAGES_ID_2" > $SYS_QPKG_DIR/loaded_docker_images } # callback-pseudo-functions PKG_PRE_REMOVE="{ IMAGE_ID=\$(/bin/cat $SYS_QPKG_DIR/loaded_docker_images) $DOCKER image rm \$IMAGE_ID }" ``` * 此檔案內容全都被註解掉, 因此直接加入即可 * **重點** : * `pkg_post_install` * 要注意到底 load 了哪些 image 壓縮檔 * `PKG_PRE_REMOVE` 是個字串 * 要留意哪些地方要跳脫, 哪些不用 ### [DottedSign_path]/shared/dotted_sign.sh 修改如下 ```sh #!/bin/sh CONF=/etc/config/qpkg.conf QPKG_NAME="dotted_sign" DOCKER_COMPOSE=$(/sbin/getcfg container-station Install_Path -f ${CONF})/bin/system-docker-compose SYS_QPKG_DIR=$(/sbin/getcfg $QPKG_NAME Install_Path -f ${CONF}) DOCKER_COMPOSE_FILE="$SYS_QPKG_DIR/docker_folder/docker-compose.yml" # # 不知道用途, 實測砍掉沒差 先保留 # export QNAP_QPKG=$QPKG_NAME case "$1" in start) ENABLED=$(/sbin/getcfg $QPKG_NAME Enable -u -d FALSE -f $CONF) if [ "$ENABLED" != "TRUE" ]; then echo "$QPKG_NAME is disabled." exit 1 fi : ADD START ACTIONS HERE $DOCKER_COMPOSE -f $DOCKER_COMPOSE_FILE -p $QPKG_NAME up -d ;; stop) : ADD STOP ACTIONS HERE $DOCKER_COMPOSE -f $DOCKER_COMPOSE_FILE -p $QPKG_NAME down ;; restart) $0 stop $0 start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 esac exit 0 ``` * 對此檔案的變更, 主要是刪除一些無用的變數設定, 加入 start / stop 的 docker-compose 指令 * **重點** : 凡是 docker-compose 的 QPKG, 此檔案內容應該幾乎一樣 * 只有 `QPKG_NAME` 會變動, 要參考你的 `qpkg.cfg` * 其餘部分完全一樣, 可以複製貼上 ## Build 專案 * `cd [DottedSign_path]` * `qbuild` ## 安裝 QPKG * 方法一 : 利用 App Center 上傳你的檔案進行安裝 * 方法二 : 若安裝檔已經在 QNap Nas 上, 可用 command line 安裝 * `cd [DottedSign_path]/build` * `chmod 755 dotted_sign_0.2.qpkg` * `./dotted_sign_0.2.qpkg`