Hub documentation

Docker Spaces

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Docker Spaces

Spaces hỗ trợ các container Docker tùy chỉnh cho các ứng dụng nằm ngoài phạm vi của Streamlit và Gradio. Docker Spaces cho phép người dùng vượt qua những giới hạn trước đây không thể thực hiện được với các SDK tiêu chuẩn. Từ các endpoint FastAPI và Go đến các ứng dụng Phoenix và công cụ ML Ops, Docker Spaces có thể hỗ trợ trong nhiều cấu hình khác nhau.

Cài đặt Docker Spaces

Việc chọn Docker làm SDK khi tạo một Space mới sẽ khởi tạo Space của bạn bằng cách đặt thuộc tính sdk thành docker trong khối YAML của tệp README.md. Hoặc, với một kho Space hiện có, hãy đặt sdk: docker bên trong khối YAML ở đầu tệp README.md của Spaces. Bạn cũng có thể thay đổi cổng mặc định được phơi bày 7860 bằng cách đặt app_port: 7860. Sau đó, bạn có thể tạo một Dockerfile thông thường.

---
title: Basic Docker SDK Space
emoji: 🐳
colorFrom: purple
colorTo: gray
sdk: docker
app_port: 7860
---

Bên trong, bạn có thể mở nhiều cổng tùy ý. Ví dụ, bạn có thể cài đặt Elasticsearch trong Space của mình và gọi nó nội bộ trên cổng mặc định 9200.

Nếu bạn muốn mở các ứng dụng được phục vụ trên nhiều cổng ra bên ngoài, một cách xử lý là sử dụng một proxy ngược như Nginx để chuyển các yêu cầu từ internet rộng lớn (trên một cổng duy nhất) đến các cổng nội bộ khác nhau.

Quản lý thông tin bí mật và biến

Bạn có thể quản lý các biến môi trường của một Space trong phần Cài đặt Space. Đọc thêm tại đây.

Biến

Thời điểm biên dịch

Các biến được truyền dưới dạng build-arg khi xây dựng Docker Space của bạn. Đọc tài liệu chuyên biệt của Docker để có hướng dẫn đầy đủ về cách sử dụng điều này trong 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

Thời gian chạy

Các biến được tiêm vào môi trường của container tại thời điểm chạy.

Mật khẩu

Thời điểm biên dịch

Trong Docker Spaces, việc quản lý bí mật (secrets) được thực hiện khác đi vì lý do bảo mật. Sau khi bạn tạo một bí mật trong tab Cài đặt, bạn có thể phơi bày bí mật đó bằng cách thêm dòng sau vào file Dockerfile của bạn:

Ví dụ, nếu SECRET_EXAMPLE là tên của bí mật bạn đã tạo trong tab Settings, bạn có thể đọc nó vào thời điểm build bằng cách gắn nó vào một tệp, sau đó đọc bằng $(cat /run/secrets/SECRET_EXAMPLE).

Xem một ví dụ bên dưới:

# 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)'

Thời gian chạy

Tương tự như với các Biến công khai, khi chạy, bạn có thể truy cập các bí mật dưới dạng các biến môi trường. Ví dụ, trong Python bạn sẽ sử dụng os.environ.get("SECRET_EXAMPLE"). Xem ví dụ này về một Docker Space sử dụng các bí mật.

Quyền

Container chạy với user ID 1000. Để tránh các vấn đề về quyền, bạn nên tạo một user và đặt WORKDIR của nó trước bất kỳ lệnh COPY hoặc thao tác tải xuống nào.

# 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.

Nếu bạn vẫn gặp vấn đề về quyền truy cập, bạn có thể cần sử dụng chmod hoặc chown trong Dockerfile của mình để cấp các quyền phù hợp. Ví dụ, nếu bạn muốn sử dụng thư mục /data, bạn có thể thực hiện như sau:

RUN mkdir -p /data
RUN chmod 777 /data

Bạn luôn nên tránh các lệnh chown không cần thiết.

Việc cập nhật metadata cho một tệp sẽ tạo ra một bản sao mới được lưu trữ trong lớp mới. Do đó, lệnh chown đệ quy có thể dẫn đến một image rất lớn do sự nhân bản của tất cả các tệp bị ảnh hưởng.

Thay vì sửa quyền bằng cách chạy chown:

COPY checkpoint .
RUN chown -R user checkpoint

bạn luôn nên thực hiện:

COPY --chown=user checkpoint .

(cũng áp dụng cho lệnh ADD)

Lưu trữ dữ liệu

Dữ liệu được ghi trên đĩa sẽ bị mất mỗi khi Docker Space của bạn khởi động lại. Để duy trì dữ liệu qua các lần khởi động lại, bạn có thể gắn một Storage Bucket vào Space của mình.

Hiện tại, volume /data chỉ khả dụng khi chạy (runtime), nghĩa là bạn không thể sử dụng /data trong bước build của Dockerfile.

Bạn cũng có thể sử dụng Datasets Hub của chúng tôi cho các trường hợp cụ thể, nơi bạn có thể lưu trữ trạng thái và dữ liệu trong một kho git LFS. Bạn có thể tìm thấy một ví dụ về tính bền vững tại đây, trong đó sử dụng thư viện huggingface_hub để tải lên các tệp lên kho dataset một cách có chương trình. Ví dụ Space này cùng với hướng dẫn này sẽ giúp bạn xác định giải pháp phù hợp nhất với loại dữ liệu của bạn.

Cuối cùng, trong một số trường hợp, bạn có thể muốn sử dụng một giải pháp lưu trữ bên ngoài từ mã của Space của mình, chẳng hạn như DB được lưu trữ bên ngoài, S3, v.v.

Docker container với GPU

Bạn có thể chạy các container Docker với hỗ trợ GPU bằng cách sử dụng một trong các Phần cứng Spaces có GPU của chúng tôi.

Chúng tôi khuyên bạn nên sử dụng nvidia/cuda từ Docker Hub làm hình ảnh cơ sở, trong đó đã cài đặt sẵn CUDA và 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).

Đọc thêm

Update on GitHub