Hub documentation
Docker Spaces
Docker Spaces
Spacesは、StreamlitやGradioの範囲外のアプリ向けのカスタムDockerコンテナをサポートしています。Docker Spacesにより、ユーザーは従来の標準SDKでは実現できなかった制約を超えて開発を進めることができます。FastAPIやGoのエンドポイント、Phoenixアプリ、ML Opsツールなど、Docker Spacesはさまざまな構成で活用できます。
Docker Spaces のセットアップ
新しい Space を作成する際に SDK としてDockerを選択すると、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 などのリバースプロキシを使用して、より広いインターネットからのリクエスト(単一のポート)を異なる内部ポートにルーティングするワークアラウンドがあります。
シークレットと変数の管理
Space の環境変数は、Space の設定から管理できます。詳細はこちらをご覧ください。
変数
ビルド時
変数は、Docker Space をビルドする際に build-arg として渡されます。Dockerfile でこれを使用する方法に関する完全なガイドについては、Docker の専用ドキュメントを参照してください。
# 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ランタイム
変数は、実行時にコンテナの環境に注入されます。
シークレット
ビルド時
Docker Spacesでは、セキュリティ上の理由により、シークレットの管理方法が異なります。Settingsタブでシークレットを作成した後、Dockerfileに以下の行を追加することで、シークレットを公開できます。
例えば、SECRET_EXAMPLE が Settings タブで作成したシークレットの名前である場合、ファイルをマウントしてビルド時に読み込むことで、$(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)'ランタイム
パブリックな Variables と同様に、実行時にシークレットを環境変数としてアクセスできます。例えば、Python では os.environ.get("SECRET_EXAMPLE") を使用します。シークレットを使用する 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>Always specify the `--chown=user` with `ADD` and `COPY` to ensure the new files are owned by your user.
まだ権限の問題が発生している場合は、Dockerfile で chmod または chown を使用して、適切な権限を付与する必要がある場合があります。例えば、/data ディレクトリを使用したい場合は、次のようにできます。
RUN mkdir -p /data
RUN chmod 777 /data不要なchownは常に避けるべきです。
ファイルのメタデータを更新すると、新しいレイヤーに新しいコピーが保存されます。そのため、再帰的なchownを実行すると、影響を受けるすべてのファイルが重複するため、非常に大きなイメージになる可能性があります。
chownを実行して権限を修正するのではなく:
COPY checkpoint .
RUN chown -R user checkpoint常に以下を実行してください:
COPY --chown=user checkpoint .(ADDコマンドも同様です)
データの永続化
Docker Spaceが再起動するたびに、ディスクに書き込まれたデータは失われます。再起動をまたいでデータを永続化するには、SpaceにStorage Bucketをアタッチできます。
現在、
/dataボリュームは実行時のみ利用可能であり、Dockerfile のビルドステップでは/dataを使用できません。
特定のケースでは、git LFS リポジトリに状態とデータを保存できる私たちの Datasets Hub も利用できます。永続化の例はこちらにあります。これはhuggingface_hubライブラリを使用して、ファイルをデータセットリポジトリにプログラムでアップロードする方法を示しています。この Space の例とこのガイドを参考にすることで、データの種類に最適なソリューションを決定できます。
最後に、Space のコードから外部ストレージソリューション(外部ホストの DB、S3 など)を使用したい場合があります。
GPU対応のDockerコンテナ
GPU対応のDockerコンテナは、GPU対応のSpaces Hardwareのいずれかを使用することで実行できます。
Docker Hub の nvidia/cuda をベースイメージとして使用することをお勧めします。このイメージには、CUDA と cuDNN がプリインストールされています。
During Docker buildtime, you don't have access to a GPU hardware. Therefore, you should not try to run any GPU-related command during the build step of your Dockerfile. For example, you can't run `nvidia-smi` or `torch.cuda.is_available()` building an image. Read more [here](https://github.com/NVIDIA/nvidia-docker/wiki/nvidia-docker#description).