Hub 文件
Docker Spaces
並獲得增強的文件體驗
開始使用
Docker Spaces
Spaces 支援自定義 Docker 容器,適用於 Streamlit 和 Gradio 範圍之外的應用程式。Docker Spaces 允許使用者超越標準 SDK 之前的限制。從 FastAPI 和 Go 端點到 Phoenix 應用程式和 ML Ops 工具,Docker Spaces 可以在許多不同的設定中提供幫助。
設定 Docker Spaces
在建立新 Space 時選擇 Docker 作為 SDK,將透過在 README.md
檔案的 YAML 塊中將 sdk
屬性設定為 docker
來初始化你的 Space。或者,對於現有 Space 儲存庫,在 Spaces README.md 檔案頂部的 YAML
塊內設定 sdk: docker
。你還可以透過設定 app_port: 7860
來更改預設暴露埠 7860
。之後,你可以建立一個常規的 Dockerfile
。
---
title: Basic Docker SDK Space
emoji: 🐳
colorFrom: purple
colorTo: gray
sdk: docker
app_port: 7860
---
在內部,你可以擁有任意數量的開放埠。例如,你可以在 Space 中安裝 Elasticsearch,並在其預設埠 9200 上內部呼叫它。
如果你想將多個埠上提供的應用程式暴露給外部世界,一個變通方法是使用反向代理(如 Nginx)將來自更廣泛網際網路的請求(在單個埠上)分派到不同的內部埠。
Secrets 和變數管理
你可以在 Space 設定中管理 Space 的環境變數。在此處閱讀更多內容。
變數
構建時
構建 Docker Space 時,變數作為 build-arg
傳遞。閱讀 Docker 的專門文件,獲取如何在 Dockerfile 中使用此功能的完整指南。
# Declare your environment variables with the ARG directive
ARG MODEL_REPO_NAME
FROM python:latest
# [...]
# You can use them like environment variables
RUN predict.py $MODEL_REPO_NAME
執行時
變數在執行時注入到容器的環境中。
Secrets
構建時
在 Docker Spaces 中,出於安全原因,secrets 管理有所不同。在 Settings 選項卡中建立 secret 後,可以透過在 Dockerfile 中新增以下行來公開該 secret
例如,如果 SECRET_EXAMPLE
是你在 Settings 選項卡中建立的 secret 的名稱,則可以透過將其掛載到檔案,然後使用 $(cat /run/secrets/SECRET_EXAMPLE)
讀取它,在構建時讀取它。
參見以下示例
# Expose the secret SECRET_EXAMPLE at buildtime and use its value as git remote URL
RUN --mount=type=secret,id=SECRET_EXAMPLE,mode=0444,required=true \
git init && \
git remote add origin $(cat /run/secrets/SECRET_EXAMPLE)
# Expose the secret SECRET_EXAMPLE at buildtime and use its value as a Bearer token for a curl request
RUN --mount=type=secret,id=SECRET_EXAMPLE,mode=0444,required=true \
curl test -H 'Authorization: Bearer $(cat /run/secrets/SECRET_EXAMPLE)'
執行時
與公共變數一樣,在執行時,你可以將 secrets 作為環境變數訪問。例如,在 Python 中,你將使用 os.environ.get("SECRET_EXAMPLE")
。請檢視此示例,瞭解使用 secrets 的 Docker Space。
許可權
容器以使用者 ID 1000 執行。為避免許可權問題,你應該建立一個使用者並在任何 COPY
或下載之前設定其 WORKDIR
。
# Set up a new user named "user" with user ID 1000
RUN useradd -m -u 1000 user
# Switch to the "user" user
USER user
# Set home to the user's home directory
ENV HOME=/home/user \
PATH=/home/user/.local/bin:$PATH
# Set the working directory to the user's home directory
WORKDIR $HOME/app
# Try and run pip command after setting the user with `USER user` to avoid permission issues with Python
RUN pip install --no-cache-dir --upgrade pip
# Copy the current directory contents into the container at $HOME/app setting the owner to the user
COPY --chown=user . $HOME/app
# Download a checkpoint
RUN mkdir content
ADD --chown=user https://<SOME_ASSET_URL> content/<SOME_ASSET_NAME>
如果仍然遇到許可權問題,你可能需要在 Dockerfile
中使用 chmod
或 chown
來授予正確的許可權。例如,如果你想使用目錄 /data
,你可以這樣做
RUN mkdir -p /data
RUN chmod 777 /data
應始終避免不必要的 chown。
與其透過執行 chown
來修復許可權
COPY checkpoint .
RUN chown -R user checkpoint
你應始終這樣做
COPY --chown=user checkpoint .
(ADD
命令也一樣)
資料永續性
除非你選擇持久儲存升級,否則只要 Docker Space 重啟,磁碟上寫入的資料就會丟失。
如果你選擇持久儲存升級,可以使用 /data
目錄來儲存資料。此目錄掛載在持久捲上,這意味著寫入此目錄的資料將在重啟後持久化。
目前,/data
卷僅在執行時可用,即在 Dockerfile 的構建步驟中不能使用 /data
。
你還可以將我們的資料集 Hub 用於特定情況,你可以在其中將狀態和資料儲存在 git LFS 儲存庫中。你可以在此處找到一個永續性示例,它使用 huggingface_hub
庫以程式設計方式將檔案上傳到資料集儲存庫。此 Space 示例以及此指南將幫助你確定哪種解決方案最適合你的資料型別。
最後,在某些情況下,你可能希望從你的 Space 程式碼中使用外部儲存解決方案,例如外部託管資料庫、S3 等。
帶 GPU 的 Docker 容器
你可以透過使用我們支援 GPU 的 Spaces 硬體之一來執行帶 GPU 支援的 Docker 容器。
我們建議使用 Docker Hub 中的 nvidia/cuda
作為基礎映象,它預裝了 CUDA 和 cuDNN。