🧠harbor封装与上传脚本

方法一:直接封裝進 Docker 鏡像(最推薦)

這是 Docker 的標準做法。你將腳本放入 Dockerfile 中,這樣鏡像在哪裡,腳本就在哪裡。
    1. 編寫 Dockerfile
      FROM redis-custom:arm64  # 或你的基礎鏡像
      # 將本地的 script.sh 複製到鏡像內的 /usr/local/bin/
      COPY script.sh /usr/local/bin/script.sh
      # 給予執行權限
      RUN chmod +x /usr/local/bin/script.sh
      
    2. 構建並推送
      這樣用戶執行 docker pull 後,進入容器就能看到這個腳本。

方法二:利用 Harbor 的 Helm Chart 倉庫(適合部署腳本)

如果你的 .sh 腳本是用來「部署」這個鏡像的(例如安裝環境的初始化腳本),你可以將它打包進 Helm Chart
    • Harbor 支持存放 Helm Charts。
    • 你可以將腳本放在 Chart 的 templates 或自定義目錄中。
    • 當別人在 Harbor 下載這個 Chart 時,腳本會跟著設定檔一起被下載。

方法三:利用 OCI Artifacts(將腳本當作「物件」存放)

現代版本的 Harbor 支持 OCI Artifacts。這意味著 Harbor 不只能存鏡像,還能存任何二進位檔案。
    1. 你可以使用 ORAS 這類工具,像 push 鏡像一樣把 .sh 腳本推送到 Harbor。
      bash
      oras push 192.168.100.226:5080/wisdom/scripts:v1.0 script.sh
      
    2. 在 Harbor 介面中,你會看到一個類型不是 Image 而是 Artifact 的標籤。


總結建議:
  • 如果腳本是運行容器時需要用到的(如啟動腳本),請用 方法一(封裝進鏡像)。
  • 如果腳本是用來管理或安裝的(如 install_redis.sh),請用 方法三 或直接在 Git 倉庫管理。

隨環境變化,最佳做法是將腳本封裝在鏡像內,但透過「環境變數 (Environment Variables)」來動態傳參。

不應該為了不同環境去修改腳本內容,而是讓腳本具備「讀取變數」的能力。

1. 修改腳本以支援變數

在你的 .sh 腳本中,使用 $變數名 來取代固定的數值。例如:
#!/bin/bash
# 使用預設值,如果環境變數沒給,就用 "default_value"
REDIS_PASSWORD=${REDIS_INIT_PWD:-"default_password"}
INIT_KEY=${CUSTOM_KEY:-"welcome_msg"}

echo "正在使用密碼 ${REDIS_PASSWORD} 初始化..."

# 執行初始化
redis-cli -a "$REDIS_PASSWORD" set "$INIT_KEY" "Hello from Harbor Image"

# 最後啟動 Redis
exec redis-server --requirepass "$REDIS_PASSWORD"

2. 在部署時傳入變數

雖然腳本已經在鏡像裡了,但你可以在啟動容器時決定這些變數的值:
    • Docker 命令行:
      docker run -d \
        -e REDIS_INIT_PWD="my_secure_password" \
        -e CUSTOM_KEY="prod_key" \
        192.168.100.226:5080/wisdom/redis-custom:v1.0
      
    • Docker Compose / Kubernetes:
      yaml 檔中的 env 區塊定義即可。

3. 如果變數非常多(例如整個設定檔)

如果環境差異大到需要改動整個 .conf 文件,建議做法是:
    1. 腳本留在鏡像內:作為處理邏輯。
    2. 設定檔掛載 (Mount):在運行時將宿主機的 config.envredis.conf 掛載進容器。
        • 指令:-v /path/to/host/config:/etc/redis/config

總結
    • 腳本 (Logic):封裝進鏡像,推送到 Harbor。
    • 變數 (Data):部署時透過 -e 傳入。


為了啟動服務與初始化數據,最正宗且最推薦的做法是將腳本直接封裝進 Docker 鏡像中

這樣做的好處是:當你執行 docker pull 時,腳本就已經在鏡像內部了,不需要額外下載或手動執行。
以下是針對你的 Redis 鏡像的具體操作建議:

1. 修改 Dockerfile (最佳實踐)

.sh 腳本放入鏡像,並利用 Docker 的 ENTRYPOINTCMD 功能讓它在容器啟動時自動執行。
dockerfile
# 假設你的基礎鏡像
FROM 192.168.100.226:5080/wisdom/redis-custom:amd64

# 將啟動腳本複製到鏡像內
COPY start-and-init.sh /usr/local/bin/start-and-init.sh

# 賦予執行權限
RUN chmod +x /usr/local/bin/start-and-init.sh

# 啟動容器時執行該腳本
ENTRYPOINT ["/usr/local/bin/start-and-init.sh"]

2. 啟動腳本 start-and-init.sh 的範例

因為 Redis 啟動後會佔據前景,你的腳本需要先啟動 Redis,再執行初始化,或者先執行初始化再啟動 Redis。
#!/bin/bash
# 1. 後台啟動 Redis (如果是為了初始化數據)
redis-server --daemonize yes

# 2. 等待 Redis 啟動完成
until redis-cli ping | grep -q PONG; do
  echo "Waiting for Redis to start..."
  sleep 1
done

# 3. 執行初始化數據 (例如匯入數據)
echo "Initializing data..."
redis-cli set mykey "myvalue" 

# 4. 關閉後台進程,改以前景啟動 (保持容器運行)
redis-cli shutdown
exec redis-server

3. 推送到 Harbor

  1. 重新 docker build 該鏡像。
  2. 按照你之前的步驟,分別推送到 arm64amd64
  3. 最後重新建立 Manifest (v1.0)。

版权声明:
作者:yxbinghe
链接:https://www.zhanhao.ch/?p=677
来源:ice.99
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>