← Containers / containers / examples
Монтирование бакетов R2 с помощью FUSE
FUSE (Filesystem in Userspace) позволяет монтировать Бакеты R2 как файловые системы внутри Containers. Приложения смогут работать с R2 через стандартные операции файловой системы, а не через API объектного хранилища.
Чтобы запустить контейнер FUSE локально, см. Поддержка FUSE при локальной разработке.
Типичные сценарии использования:
- Начальная настройка контейнеров с ресурсами - Монтируйте наборы данных, модели или зависимости для песочниц и агентных сред
- Сохранение состояния пользователя - Храните и получайте доступ к пользовательской конфигурации или состоянию приложения без управления загрузками
- Крупные статические файлы - Не раздувайте образы контейнеров и не загружайте файлы при запуске
- Редактирование файлов - Делает код или конфигурацию доступными внутри контейнера и сохраняет изменения между экземплярами.
Подключение бакетов
Чтобы смонтировать бакет R2, установите адаптер FUSE в своём Dockerfile и настройте его запуск при старте контейнера.
В этом примере используется tigrisfs ↗, который поддерживает S3-совместимое хранилище, включая R2:
Dockerfile
FROM alpine:3.20
# Install FUSE and dependencies
RUN apk add --no-cache \
--repository http://dl-cdn.alpinelinux.org/alpine/v3.20/main \
ca-certificates fuse curl bash
# Install tigrisfs
RUN ARCH=$(uname -m) && \
if [ "$ARCH" = "x86_64" ]; then ARCH="amd64"; fi && \
if [ "$ARCH" = "aarch64" ]; then ARCH="arm64"; fi && \
VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && \
curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz && \
tar -xzf /tmp/tigrisfs.tar.gz -C /usr/local/bin/ && \
rm /tmp/tigrisfs.tar.gz && \
chmod +x /usr/local/bin/tigrisfs
# Create startup script that mounts bucket and runs a command
RUN printf '#!/bin/sh\n\
set -e\n\
\n\
mkdir -p /mnt/r2\n\
\n\
R2_ENDPOINT="https://${R2_ACCOUNT_ID}.r2.cloudflarestorage.com"\n\
echo "Mounting bucket ${R2_BUCKET_NAME}..."\n\
/usr/local/bin/tigrisfs --endpoint "${R2_ENDPOINT}" -f "${R2_BUCKET_NAME}" /mnt/r2 &\n\
sleep 3\n\
\n\
echo "Contents of mounted bucket:"\n\
ls -lah /mnt/r2\n\
' > /startup.sh && chmod +x /startup.sh
EXPOSE 8080
CMD ["/startup.sh"]Стартовый скрипт создаёт точку монтирования, запускает tigrisfs в фоновом режиме для монтирования бакета, а затем выводит содержимое смонтированного каталога.
Передача учётных данных в контейнер
Вашему Container нужен Учётные данные R2 и конфигурацию, переданную через переменные окружения. Храните учётные данные как Секреты Worker, затем передайте их через envVars свойство:
import { Container, getContainer } from "@cloudflare/containers";
export class FUSEDemo extends Container {
defaultPort = 8080;
sleepAfter = "10m";
envVars = {
AWS_ACCESS_KEY_ID: this.env.AWS_ACCESS_KEY_ID,
AWS_SECRET_ACCESS_KEY: this.env.AWS_SECRET_ACCESS_KEY,
R2_BUCKET_NAME: this.env.R2_BUCKET_NAME,
R2_ACCOUNT_ID: this.env.R2_ACCOUNT_ID,
};
}import { Container, getContainer } from "@cloudflare/containers";
interface Env {
FUSEDemo: DurableObjectNamespace<FUSEDemo>;
AWS_ACCESS_KEY_ID: string;
AWS_SECRET_ACCESS_KEY: string;
R2_BUCKET_NAME: string;
R2_ACCOUNT_ID: string;
}
export class FUSEDemo extends Container<Env> {
defaultPort = 8080;
sleepAfter = "10m";
envVars = {
AWS_ACCESS_KEY_ID: this.env.AWS_ACCESS_KEY_ID,
AWS_SECRET_ACCESS_KEY: this.env.AWS_SECRET_ACCESS_KEY,
R2_BUCKET_NAME: this.env.R2_BUCKET_NAME,
R2_ACCOUNT_ID: this.env.R2_ACCOUNT_ID,
};
} AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY следует хранить как секреты, тогда как R2_BUCKET_NAME и R2_ACCOUNT_ID можно настроить как переменные в вашем wrangler.jsonc:
{
"vars": {
"R2_BUCKET_NAME": "my-bucket",
"R2_ACCOUNT_ID": "your-account-id"
}
}Другие S3-совместимые провайдеры хранилища
Другие S3-совместимые провайдеры хранилища, включая AWS S3 и Google Cloud Storage, можно монтировать так же, как R2. Для этого потребуется указать соответствующий URL конечной точки и учётные данные доступа для выбранного провайдера.
Монтирование префиксов бакетов
Чтобы смонтировать определённый префикс (подкаталог) внутри бакета, большинству адаптеров FUSE требуется смонтировать весь бакет целиком, а затем обращаться к пути префикса внутри точки монтирования.
С tigrisfs смонтируйте бакет и обращайтесь к префиксу через путь файловой системы:
RUN printf '#!/bin/sh\n\
set -e\n\
\n\
mkdir -p /mnt/r2\n\
\n\
R2_ENDPOINT="https://${R2_ACCOUNT_ID}.r2.cloudflarestorage.com"\n\
/usr/local/bin/tigrisfs --endpoint "${R2_ENDPOINT}" -f "${R2_BUCKET_NAME}" /mnt/r2 &\n\
sleep 3\n\
\n\
echo "Accessing prefix: ${BUCKET_PREFIX}"\n\
ls -lah "/mnt/r2/${BUCKET_PREFIX}"\n\
' > /startup.sh && chmod +x /startup.shПосле этого ваше приложение может читать данные из /mnt/r2/${BUCKET_PREFIX} для доступа только к файлам с этим префиксом. Передайте BUCKET_PREFIX как переменную окружения вместе с остальными настройками R2.
Монтирование бакетов в режиме только для чтения
Чтобы запретить приложениям запись в смонтированный бакет, добавьте -o ro флаг, чтобы смонтировать файловую систему в режиме только для чтения:
RUN printf '#!/bin/sh\n\
set -e\n\
\n\
mkdir -p /mnt/r2\n\
\n\
R2_ENDPOINT="https://${R2_ACCOUNT_ID}.r2.cloudflarestorage.com"\n\
/usr/local/bin/tigrisfs --endpoint "${R2_ENDPOINT}" -o ro -f "${R2_BUCKET_NAME}" /mnt/r2 &\n\
sleep 3\n\
\n\
ls -lah /mnt/r2\n\
' > /startup.sh && chmod +x /startup.shЭто полезно для общих ресурсов или файлов конфигурации, когда нужно гарантировать, что приложения только читают данные.
Дополнительные материалы
- Переменные окружения Container - Узнайте, как передавать секреты и переменные в Containers
- tigrisfs ↗ - Адаптер FUSE для хранилищ, совместимых с S3, включая R2
- s3fs ↗ - Альтернативный адаптер FUSE для хранилищ, совместимых с S3
- gcsfuse ↗ - Адаптер FUSE для бакетов Google Cloud Storage