在localstack上自动创建S3存储桶

Tho*_*rge 13 amazon-s3 docker-compose atlassian-localstack

在docker中使用localstack-compose主要是为了模仿S3.

我知道我可以创建桶,这不是问题.我想做的是在运行docker-compose时自动创建存储桶.

是否已为localstack构建了一些东西?

Mat*_*man 47

自 version 以来此提交带来的更改0.10.0

当容器第一次启动时,它将执行扩展名为 .sh 的文件,这些文件位于 .sh 中/docker-entrypoint-initaws.d。文件将按字母顺序执行。您可以在初始化脚本中使用 awslocal(或 aws)cli 工具在 localstack 上轻松创建 aws 资源。

version: '3.7'
services:
  localstack:
    image: localstack/localstack
    environment:
      - SERVICES=s3
    ports:
      - "4566:4566"
      # - "4572:4572" Old S3 port
    volumes:
      - ./aws:/docker-entrypoint-initaws.d
Run Code Online (Sandbox Code Playgroud)

使用目录中的脚本./aws/buckets.sh

#!/bin/bash
set -x
awslocal s3 mb s3://bucket
set +x
Run Code Online (Sandbox Code Playgroud)

注意:set [-/+] x纯粹是为了打开和关闭正在执行的命令的输出。

将产生此输出:

...
localstack_1  | Starting mock S3 (http port 4572)...
localstack_1  | Waiting for all LocalStack services to be ready
localstack_1  | Ready.
localstack_1  | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initaws.d/buckets.sh
localstack_1  | ++ awslocal s3 mb s3://bucket
localstack_1  | make_bucket: bucket
localstack_1  | ++ set +x
localstack_1  |
Run Code Online (Sandbox Code Playgroud)


Sat*_*Okh 8

我已经能够使用 Localstack 和某种“解决方法”来实现这一点:

  1. 启动本地堆栈

  2. 创建预期的存储桶,例如:

    aws --endpoint-url=http://localhost:4572 s3 mb s3://test1   
    
    Run Code Online (Sandbox Code Playgroud)
  3. 上面的行将更新s3_api_calls.jsonLocalstack 目录中的文件(默认情况下,在 Linux 上它是 /tmp/localstack/data

  4. 备份文件

  5. /tmp/localstack/data在再次启动堆栈之前,将复制的文件放入 Localstack 目录(默认情况下)

  6. 再次启动 Localstack 后,您应该能够看到类似2019-03-21T08:38:28:INFO:localstack.utils.persistence: Restored 2 API calls from persistent file: /tmp/localstack/data/s3_api_calls.json启动日志的内容,并且存储桶应该可用:aws --endpoint-url=http://localhost:4572 s3 ls s3://test1


Erm*_*ary 6

LocalStack v1.1.3及以上版本用户的重要通知

/docker-entrypoint-initaws.d自 2022 年 12 月 1 日起,LocalStack 宣布随着v1.3.0的发布,弃用旧版初始化脚本 ( ) 。替代品 -可插拔初始化挂钩- 是在 v1.1.0 中引入的。

它们将在 v2.0.0 中被完全删除/docker-entrypoint-initaws.d,这会给使用最新版本 LocalStack 的任何人带来风险。

这将是一个突破性的改变。

为了面向未来,接受的答案仍然有效,但我建议替换/docker-entrypoint-initaws.d/etc/localstack/init/ready.d.

这将模仿之前的预期行为,因为它将挂钩到READYLocalStack 可以实际创建 S3 存储桶的阶段,同时确保您仍然可以继续更新 LocalStack。

这将是最好的电流Dockerfile

version: '3.8'
services:
  localstack:
    image: localstack/localstack:latest
    environment:
      - SERVICES=s3
    ports:
      - "4566:4566"
    volumes:
      - ./aws:/etc/localstack/init/ready.d
Run Code Online (Sandbox Code Playgroud)