如何配置Docker使模拟S3存储的数据在系统重启后持久化?
解决LocalStack S3数据持久化问题及替代方案
一、修改LocalStack配置实现持久化
你的配置已设置DATA_DIR=/tmp/localstack/data,但未将该容器内目录挂载到宿主机,导致容器销毁后数据丢失。只需补充卷挂载并开启持久化模式即可解决:
修改后的docker-compose.yml
version: '3.8' services: localstack: image: localstack/localstack:latest environment: - DEFAULT_REGION=ap-northeast-1 - EDGE_PORT=4566 - SERVICES=s3,logs - AWS_DEFAULT_REGION=us-west-1 - AWS_ACCESS_KEY_ID=xxx - AWS_SECRET_ACCESS_KEY=xxx - DOCKER_HOST=unix:///var/run/docker.sock - DATA_DIR=/tmp/localstack/data - PERSISTENCE=1 # 开启持久化,LocalStack会将状态保存到DATA_DIR ports: - '4566-4583:4566-4583' volumes: - ./make_bucket.sh:/docker-entrypoint-initaws.d/make_bucket.sh - localstack_data:/tmp/localstack/data # 挂载本地卷到容器数据目录 # 定义Docker管理的本地卷,自动处理宿主机存储路径 volumes: localstack_data:
优化初始化脚本
持久化后重启容器时,原脚本会因存储桶已存在报错,修改make_bucket.sh增加存在性判断:
#!/bin/bash aws --endpoint-url=http://localhost:4566 s3api head-bucket --bucket my-bucket || aws --endpoint-url=http://localhost:4566 s3 mb s3://my-bucket
二、替代方案:使用MinIO(原生兼容S3,持久化更简洁)
MinIO是轻量高性能的对象存储服务,完全兼容S3 API,原生支持数据持久化,配置更直观:
MinIO的docker-compose.yml配置
version: '3.8' services: minio: image: minio/minio:latest command: server /data --console-address ":9001" environment: - MINIO_ROOT_USER=admin - MINIO_ROOT_PASSWORD=password123 ports: - "9000:9000" # S3标准API端口 - "9001:9001" # Web控制台端口 volumes: - minio_data:/data # 挂载数据卷,持久化存储所有对象 volumes: minio_data:
使用说明
- 启动后访问
http://localhost:9001,用配置的账号密码登录控制台,手动创建my-bucket - 使用AWS CLI访问时,指定endpoint为
http://localhost:9000,密钥使用MINIO_ROOT_USER和MINIO_ROOT_PASSWORD
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

