【问题标题】:Running shell script against Localstack in docker container在 docker 容器中针对 Localstack 运行 shell 脚本
【发布时间】:2022-03-02 12:24:00
【问题描述】:

我一直在使用 localstack 来开发针对本地的服务。我刚刚通过docker run --rm -p 4567-4583:4567-4583 -p 8080:8080 localstack/localstack运行他们的docker镜像

然后我手动运行一个小脚本来设置我的 S3 存储桶、SQS 队列等。

现在,我想让其他人更容易做到这一点,所以我想我只需添加一个 Dockerfile 和 docker-compose.yml 文件。不幸的是,当我尝试使用docker-compose up 启动并运行它时,我收到一个错误,即我的安装脚本中的命令无法连接到localstack 服务。

make_bucket failed: s3://localbucket Could not connect to the endpoint URL: "http://localhost:4572/localbucket"

Dockerfile:

FROM localstack/localstack

#since this is just local dev set up, localstack doesn't require 
anything specific here.
ENV AWS_DEFAULT_REGION='[useast1]'
ENV AWS_ACCESS_KEY_ID='[lloyd]'
ENV AWS_SECRET_ACCESS_KEY='[christmas]'

COPY bin/localSetup.sh /localSetup.sh
COPY fixtures/notifications.json /notifications.json
RUN ["chmod", "+x", "/localSetup.sh"]
RUN pip install awscli

# expose service & web dashboard ports
EXPOSE 4567-4582 8080

ENTRYPOINT ["/localSetup.sh"]

docker-compose.yml

version: '3'
services:
  localstack:
    build: .
    ports:
      - "8080:8080"
      - "4567-4582:4567-4582"

localSetup.sh

#!/bin/bash

aws --endpoint-url=http://localhost:4572 s3 mb s3://localbucket
#additional similar calls but left off for brevity

我尝试在我的脚本命令中将localhost 切换为127.0.0.1,但我最终遇到了同样的错误。我可能在这里遗漏了一些愚蠢的东西。

【问题讨论】:

  • 你找到解决办法了吗?

标签: docker docker-compose localstack


【解决方案1】:

create your custom AWS resources when localstack freshly starts up. 还有另一种方法,因为您已经有一个用于资源的 bash 脚本,您可以简单地将脚本卷挂载到/docker-entrypoint-initaws.d/。 所以我的 docker-compose 文件是:

localstack:
    image: localstack/localstack:latest
    container_name: localstack_aws
    ports:
      - '4563-4599:4563-4599'
      - '8055:8080'
    environment:
      - SERVICES=s3
      - DEFAULT_REGION=us-east-1
    volumes:
      - './localSetup.sh:/docker-entrypoint-initaws.d/make-s3.sh'

另外,我更喜欢 bash 脚本中的 awslocal 而不是 aws --endpoint,因为它为您利用凭据工作和端点。

【讨论】:

  • 这很完美!我想用本地 csv 初始化存储桶以进行测试。你对如何做到这一点有什么建议吗?
  • 不再需要回答了。我已经想通了:)。我使用卷来交换数据,然后运行 ​​awslocal s3 cp /path/to/file s3://bucket/path/to/file。
【解决方案2】:

尝试将主机名添加到 docker-compose 文件并编辑您的入口点文件以反映该主机名。

docker-compose.yml

version: '3'
services:
  localstack:
    build: .
    hostname: localstack
    ports:
      - "8080:8080"
      - "4567-4582:4567-4582"

localSetup.sh

#!/bin/bash

aws --endpoint-url=http://localstack:4572 s3 mb s3://localbucket

这是我的docker-compose-dev.yaml,用于测试使用 localstack 的应用程序。我使用了命令docker-compose -f docker-compose-dev.yaml up,我也使用了你使用的localSetup.sh

version: '3'
services:

  localstack:
    image: localstack/localstack
    hostname: localstack
    ports:
      - "4567-4584:4567-4584"
      - "${PORT_WEB_UI-8082}:${PORT_WEB_UI-8082}"
    environment:
      - SERVICES=s3
      - DEBUG=1
      - DATA_DIR=${DATA_DIR- }
      - PORT_WEB_UI=${PORT_WEB_UI- }
      - DOCKER_HOST=unix:///var/run/docker.sock
    volumes:
      - "${TMPDIR:-/tmp/localstack}:/tmp/localstack"
      - "/var/run/docker.sock:/var/run/docker.sock"
    networks:
      - backend

  sample-app:
    image: "sample-app/sample-app:latest"
    networks:
      - backend
    links:
      - localstack
    depends_on:
      - "localstack"

networks: 
  backend:
    driver: 'bridge'

【讨论】:

    猜你喜欢
    • 2022-08-16
    • 2022-10-20
    • 2015-10-13
    • 2021-10-22
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    相关资源
    最近更新 更多