You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LocalStack TestContainer初始化脚本未执行问题求助

解决LocalStack TestContainer初始化脚本未执行的问题

1. 修正资源映射路径

你的脚本实际位于classpath:localstack/init.sh,但当前配置的路径与实际位置不匹配,导致容器无法找到脚本。需要调整withClasspathResourceMapping的源路径:

@Container
static LocalStackContainer localStack =
        new LocalStackContainer(DockerImageName.parse("localstack/localstack"))
                // 直接使用类路径下的相对路径,无需./前缀
                .withClasspathResourceMapping("localstack/init.sh",
                        "/etc/localstack/init/ready.d/init.sh", BindMode.READ_ONLY)
                .withServices(LocalStackContainer.Service.SQS, LocalStackContainer.Service.S3)
                .waitingFor(Wait.forLogMessage("Initialized.", 1));

注意:withClasspathResourceMapping的第一个参数是类路径根目录下的相对路径,因为你的脚本在src/test/resources/localstack/下,对应classpath根目录的localstack/init.sh。

2. 确保脚本具备可执行权限

LocalStack要求初始化脚本拥有执行权限,可通过两种方式配置:

  • 构建时配置(以Maven为例):在pom.xml中添加资源权限设置
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.3.1</version>
    <executions>
        <execution>
            <id>copy-resources</id>
            <phase>process-test-resources</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.testOutputDirectory}/localstack</outputDirectory>
                <resources>
                    <resource>
                        <directory>src/test/resources/localstack</directory>
                        <includes>
                            <include>init.sh</include>
                        </includes>
                        <filtering>false</filtering>
                        <fileMode>755</fileMode>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>
  • 代码中显式设置:在TestContainer配置中添加命令给容器内脚本加权限
.withCommand("/bin/sh", "-c", "chmod +x /etc/localstack/init/ready.d/init.sh && docker-entrypoint.sh")

3. 确认LocalStack初始化目录的正确性

LocalStack不同版本的初始化目录有差异:

  • 新版本(v2+)推荐使用/etc/localstack/init/ready.d/:服务就绪后执行脚本,能确保awslocal命令可用
  • 旧版本可能使用/docker-entrypoint-initaws.d/:容器启动时执行,部分场景下服务未就绪会导致awslocal命令失败

优先选择/etc/localstack/init/ready.d/目录。

4. 调试排查脚本执行问题

若脚本仍未执行,可通过以下方式定位问题:

  • 查看容器日志:直接打印容器日志或手动执行docker logs <容器ID>查看输出
  • 检查脚本是否存在:进入容器执行docker exec -it <容器ID> ls -l /etc/localstack/init/ready.d/
  • 手动执行脚本:进入容器执行docker exec -it <容器ID> sh /etc/localstack/init/ready.d/init.sh,查看是否有报错信息

内容的提问来源于stack exchange,提问作者zouroto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:00:06