在CDK打包流程中运行amazon/dynamodb-local的问题
解决方案:自动创建Docker网络,实现CDK打包时DynamoDB Local与构建容器协同运行
问题原因
你遇到的错误是因为java-build-local网络在Docker主机上尚未创建:CDK的bundling配置仅指定构建容器加入该网络,不会自动创建;而Maven的Docker插件尝试将DynamoDB Local容器接入不存在的网络,导致启动失败。
方案1:在构建命令中提前创建网络
直接修改CDK bundling的执行命令,在运行Maven构建前检查并创建目标网络(利用挂载的docker.sock在容器内执行Docker命令):
this.function = new lambda.Function(this, "Function", { runtime: lambda.Runtime.JAVA_21, code: lambda.Code.fromAsset(`../assets-java/${props.serviceName}`, { bundling: { command: [ "/bin/sh", "-c", // 先检查网络是否存在,不存在则创建 `docker network inspect java-build-local >/dev/null 2>&1 || docker network create java-build-local; mvn clean install && cp /asset-input/target/${props.serviceName}-1.0.jar /asset-output/`, ], // 其余配置保持不变 image: lambda.Runtime.JAVA_21.bundlingImage, bundlingFileAccess: cdk.BundlingFileAccess.VOLUME_COPY, user: "root", outputType: cdk.BundlingOutput.ARCHIVED, network: "java-build-local", volumes: [ { hostPath: process.env["HOME"] + "/.m2/", containerPath: "/root/.m2/" }, { hostPath: "/var/run/docker.sock", containerPath: "/var/run/docker.sock" } ], } }), // 其余配置保持不变 handler: props.handler, logRetention: RetentionDays.THREE_MONTHS, timeout: Duration.minutes(5), environment: { ...props.env, "JAVA_TOOL_OPTIONS": "-Dlog4j.configurationFile=log4j2.xml" } })
方案2:通过Maven Docker插件自动创建网络
修改docker-maven-plugin的配置,添加网络自动创建规则,插件会在启动容器前检查并创建目标网络:
<plugin> <groupId>io.fabric8</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.38.0</version> <executions> <execution> <id>start-docker-container</id> <phase>generate-test-resources</phase> <goals> <goal>start</goal> </goals> </execution> <execution> <id>stop-docker-container</id> <phase>prepare-package</phase> <goals> <goal>stop</goal> </goals> </execution> </executions> <configuration> <!-- 添加网络自动配置 --> <networks> <network> <name>java-build-local</name> <create> <enabled>true</enabled> <!-- 可选:默认桥接模式,如需自定义可修改 --> <driver>bridge</driver> </create> </network> </networks> <images> <image> <name>amazon/dynamodb-local</name> <run> <ports> <port>8123:8000</port> </ports> <network> <name>java-build-local</name> <alias>dynamodb-local</alias> </network> </run> </image> </images> </configuration> </plugin>
额外注意事项
- 由于你已将主机的
docker.sock挂载到构建容器内,容器拥有执行Docker命令的权限,两种方案均可正常生效。 - 打包完成后可通过
docker network rm java-build-local清理临时网络,避免资源残留。
内容的提问来源于stack exchange,提问作者Matthew Shea
相关产品推荐
相关产品推荐

