04_example.md 5.7 KB

範例 : 將 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 修改如下

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 修改如下

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 修改如下

#!/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