需要存取 Docker 容器中的 volume

大家好,

我有一個支援應用程式 SimpleHelp,目前在 Container Station 的 Docker 容器中運行。運作非常順利,但我遇到了一個問題。當 SimpleHelp 軟體有新版本推出時,我無法更新它。當然,我可以每次都建立一個新容器,但每次都要重新建立所有偏好設定,這樣很麻煩。

我希望能夠存取容器內的檔案,或是將容器設置成可以使用我 NAS 上的目錄。我一直在嘗試透過建立 volume(卷)來達成這個目的,但操作過程並不清楚,而且我一直遇到困難,因為在建立 volume 時需要輸入容器名稱,而我輸入的每個容器名稱都被視為無效路徑,所以我卡住了。

肯定有方法可以做到這一點,所以我在這裡詢問大家。

謝謝!

你可以使用 compose 檔案來設置,並將設定和資料儲存在 NAS 上的永久資料夾中

例如:

謝謝,但老實說我完全不知道該怎麼做!我對 Docker 完全是新手,也不知道怎麼寫 compose 腳本……

我應該要加在這裡嗎?

    volumes:
       - /etc/timezone:/etc/timezone:ro
       - /etc/localtime:/etc/localtime:ro
       - /opt/appdata/simplehelp/configuration:/opt/SimpleHelp/configuration

那我可以直接用 QNAP 標準路徑指向資料夾嗎?上面那些路徑都是容器內部的本地路徑——對嗎?那我要怎麼指定容器外部的路徑呢?

應該是

/share/‘sharename’

OK。所以需要像這樣嗎:

    volumes:
       - /etc/timezone:/etc/timezone:ro
       - /etc/localtime:/etc/localtime:ro
       - /opt/appdata/simplehelp/configuration:/share/Container/SimpleHelp

這樣對嗎?

應該是相反的順序……先寫本地掛載的位置,再寫容器內部的位置

- /share/Container/SimpleHelp:/opt/appdata/simplehelp/configuration

好的。我需要在它後面加上 :rw,還是寫 read/write,還是直接保持原樣?

你可以……我認為預設是 rw,而 ro 是由那個旗標設定的。

例如,你可以將 Plex 媒體資料夾設為 ro,這樣即使容器遭到惡意軟體感染,也無法刪除你的媒體檔案。

好的,謝謝。我會試試看。

那麼,有沒有辦法從 NAS 讀取現有的容器檔案?我一直沒能搞清楚。是不可能嗎?

您可以透過 WinSCP(方便的圖形介面)瀏覽已建立的磁碟區,只需前往此處顯示的位置


是的,我目前的容器沒有任何卷。我只是用精靈從倉庫建立了它。

在 File Station 中,我可以進入:

/Container/container-station-data/lib/docker/containers/aa5528825f8a5980c5caffbc046d9057ee10f0fadea6a932697fb5fac51ce90c

但裡面沒有什麼有用的東西。那我需要用 WinSCP 嗎?

嗯……你可以嘗試新增一個容器的 SSH 會話,然後直接連接到容器(也可以透過 SSH 連接,應該可行)。

我可以進入容器的主控台,但我不知道怎麼離開容器到外部…

好的。我做錯了什麼。我拿了 YML 檔案並修改它,按照我們討論的方式新增了本地卷來儲存資料。我在 ContainerStation 中將它建立為一個應用程式。但沒有任何應用程式顯示出來。不過我在映像檔中看到另一個 Docker 映像檔。所以我安裝並啟動了它,但我在 NAS 上為儲存資料所建立的資料夾裡什麼都沒有。

我下載了你使用的相同 Docker 映像,預設安裝包含了 3 個 NAT 端口映射
SSH
HTTP
HTTPS

試試看能否透過那個連接 SSH

很遺憾,沒有。連線被拒絕了。我可以使用 SimpleHelp 管理員應用程式來備份我的伺服器資料。所以如果我現在能夠把這些資料儲存到我的 NAS 上的一個可存取的資料夾裡,我應該就能從備份恢復。不過我用 YML 檔案的嘗試似乎沒有成功。所以我們來專注於這個部分吧……

看起來應用程式沒有被建立:

無法建立應用程式「simplehelp」。錯誤訊息:operateApp 操作 [--project-name simplehelp up -d --remove-orphans] 失敗:退出狀態 1:time="2025-03-27T12:19:37-05:00" level=warning msg="/share/CACHEDEV2_DATA/.qpkg/container-station/data/application/simplehelp/docker-compose.yml: 屬性version 已過時,將被忽略,請移除以避免潛在混淆" network frontbridge 宣告為 external,但找不到

你可以發布 compose 檔案嗎?

version: "3.2"

services:
#SimpleHelp 容器
  simplehelp:
    image: tecneo/simplehelp
    container_name : simplehelp
    ports:
      - "8680:80"
      - "8681:80/udp"
      - "8643:443"
      - "8643:443/udp"
    volumes:
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
      - /share/Container/SimpleHelp/configuration:/opt/SimpleHelp/configuration
    restart: unless-stopped
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.simplehelp.rule=Host(`SUBDOMAIN.DOMAIN.EXT`)"
      - "traefik.http.routers.simplehelp.entrypoints=web,websecure"
      - "traefik.http.routers.simplehelp.tls.certresolver=myresolver"
      - "traefik.http.services.simplehelp.loadbalancer.server.port=80"
      - "traefik.udp.routers.simplehelp-udp.entrypoints=webudp"
      - "traefik.udp.routers.simplehelp-udp.service=simplehelp"
      - "traefik.udp.services.simplehelp.loadbalancer.server.port=80"
    networks:
      - frontbridge
      
networks:
  frontbridge:
    external: true

我只是把那個路徑名稱從你貼的 GitHub 連結上的名稱改掉了。

在我這裡運作正常,當我移除那個 networking 區段時(反正 NAT 已經在上面定義過了)

services:
#SimpleHelp 容器
  simplehelp:
    image: tecneo/simplehelp
    container_name : simplehelp
    ports:
      - "8680:80"
      - "8681:80/udp"
      - "8643:443"
      - "8643:443/udp"
    volumes:
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
      - /share/Container/SimpleHelp/configuration:/opt/SimpleHelp/configuration
    restart: unless-stopped
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.simplehelp.rule=Host(`SUBDOMAIN.DOMAIN.EXT`)"
      - "traefik.http.routers.simplehelp.entrypoints=web,websecure"
      - "traefik.http.routers.simplehelp.tls.certresolver=myresolver"
      - "traefik.http.services.simplehelp.loadbalancer.server.port=80"
      - "traefik.udp.routers.simplehelp-udp.entrypoints=webudp"
      - "traefik.udp.routers.simplehelp-udp.service=simplehelp"
      - "traefik.udp.services.simplehelp.loadbalancer.server.port=80"

在我這裡,設定資料夾能夠成功被填充