【问题标题】:How do I execute a shell script against my localstack Docker container after it loads?如何在加载后对我的 localstack Docker 容器执行 shell 脚本?
【发布时间】:2022-08-16 19:49:59
【问题描述】:

我想启动一个 localstack docker 容器并使用命令运行一个文件 create_bucket.sh

aws --endpoint-url=http://localhost:4566 s3 mb s3://my-bucket

容器启动后。我尝试创建这个 Dockerfile

FROM: localstack/localstack:latest
COPY create_bucket.sh /usr/local/bin/
ENTRYPOINT []

和一个 docker-compose.yml 文件

version: \'3.8\'
services:
  localstack:
    image: localstack/localstack:latest
    environment:
      ...
    ports:
      - \'4566-4583:4566-4583\'
    command: sh -c \"/usr/local/bin/create_bucket.sh\"

但是当我跑步时

docker-compose up

容器出现,但命令未运行。容器启动后如何对 localstack 容器执行命令?

    标签: docker amazon-s3 docker-compose dockerfile localstack


    【解决方案1】:

    如果执行到容器中,create_bucket.sh 不会被复制。我不知道为什么,我也无法让它工作。

    但是,如果您可以使用启动脚本,我有一个可行的解决方案,因为您的目标是启动容器并在单个命令中执行存储桶的创建。

    1. docker-compose.yml 中为您的容器分配一个名称
      version: '3.8'
      services:
        localstack:
          image: localstack/localstack:latest
          container_name: localstack
          ports:
            - '4566-4583:4566-4583'
      
      1. 更新您的create_bucket.sh 以改用awslocal,它已经在容器中可用。使用带有endpoint-urlaws cli 需要aws configure 作为先决条件。
      awslocal s3 mb s3://my-bucket
      
      1. 最后,创建一个启动脚本来运行命令列表以完成初始设置。
      docker-compose up -d
      docker cp create_bucket.sh localstack:/usr/local/bin/
      docker exec -it localstack sh -c "chmod +x /usr/local/bin/create_bucket.sh"
      docker exec -it localstack sh -c "/usr/local/bin/create_bucket.sh"
      
      1. 执行启动脚本
      sh startup.sh
      

      为了验证,如果您现在将exec 放入正在运行的容器中,则该存储桶将被创建。

      docker exec -it localstack /bin/sh
      awslocal s3 ls
      

    【讨论】:

      【解决方案2】:

      您可以使用挂载卷而不是“命令”在启动容器中执行脚本。

      volumes:
            - ./create_bucket.sh:/docker-entrypoint-initaws.d/create_bucket.sh
      

      此外,正如他们在documentation 中指定的那样,必须精确配置 localstack 以与 docker-compose 一起使用。

      请注意,通过 docker-compose 手动配置堆栈时存在一些缺陷(例如,所需的容器名称、Docker 网络、卷挂载、环境变量等)

      在您的情况下,我猜您缺少一些卷、容器名称和变量。

      这是找到here 的docker-compose.yml 示例,我或多或少地适应了您的情况

      version: '3.8'
      
      services:
        localstack:
          image: localstack/localstack
          container_name: localstack-example
          hostname: localstack
          ports:
            - "4566-4583:4566-4583"
          environment:
            # Declare which aws services will be used in localstack
            - SERVICES=s3
            - DEBUG=1
            # These variables are needed for localstack
            - AWS_DEFAULT_REGION=<region>
            - AWS_ACCESS_KEY_ID=<id>
            - AWS_SECRET_ACCESS_KEY=<access_key>
            - DOCKER_HOST=unix:///var/run/docker.sock
            - DATA_DIR=/tmp/localstack/data
          volumes:
            - "${TMPDIR:-/tmp}/localstack:/tmp/localstack"
            - /var/run/docker.sock:/var/run/docker.sock
            - ./create_bucket.sh:/docker-entrypoint-initaws.d/create_bucket.sh
      

      其他来源:

      【讨论】:

      • 真的很好的解决方案。谢谢!
      【解决方案3】:

      试试下面的执行

      docker exec Container_ID Your_Command
      

      【讨论】:

      • 我不明白——我应该运行它而不是“docker-compose.yml”?
      • 这样,一旦容器启动,您就可以从主机对容器运行任何缺少的命令
      • 我的目标是在单个命令中启动容器并执行存储桶的创建,最好是“docker-compose up”,因为这是其他开发人员会知道的标准命令。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-20
      • 2021-07-16
      • 1970-01-01
      相关资源
      最近更新 更多