Docker Compose中Localstack的Lambda无法访问MariaDB容器问题求助
排查Docker Compose部署Localstack+Lambda+MariaDB的调用问题
1. 统一自定义网络配置,避免动态命名问题
不要依赖Compose自动生成的<project>_default网络,显式定义一个自定义网络,确保所有服务(Localstack、MariaDB、Lambda执行容器)都在同一网络:
- 在
docker-compose.yml中添加自定义网络:networks: local-network: name: local-network driver: bridge - 给每个服务指定该网络:
services: localstack: ... networks: - local-network mariadb: ... networks: - local-network - 设置Localstack的
LAMBDA_DOCKER_NETWORK为这个显式的网络名local-network,避免动态命名导致的网络匹配失败。
2. 修正Lambda代码中的数据库连接地址
Lambda容器的localhost不等于宿主机或MariaDB容器,必须用Compose中MariaDB的服务名作为连接主机:
- 比如MariaDB服务名为
mariadb,连接字符串应写为:const connection = mysql.createConnection({ host: 'mariadb', // 禁止使用localhost或127.0.0.1 user: 'your-user', password: 'your-password', database: 'your-db', port: 3306 // 使用容器内部端口,而非宿主机映射端口 });
3. 确保Lambda打包包含依赖库
JavaScript连接MariaDB需要mysql2或mysql包,必须将依赖与代码一起打包:
- 在代码目录执行:
npm install mysql2 --production zip -r lambda-package.zip index.js node_modules/ - 上传这个
lambda-package.zip到Localstack,不要只上传单个index.js文件。
4. 检查Localstack的Lambda执行配置
确保Localstack启用了正确的执行模式和服务:
- 在
docker-compose.yml的Localstack服务中添加:environment: - LOCALSTACK_SERVICES=lambda - LAMBDA_EXECUTOR=docker # 默认值为docker,确保未修改为其他模式 - LAMBDA_DOCKER_NETWORK=local-network # 与自定义网络名保持一致
5. 提取详细错误日志定位问题
调用Lambda时获取精准错误信息:
- 用AWS CLI(指向Localstack)调用并查看输出:
aws lambda invoke --endpoint-url=http://localhost:4566 --function-name your-function-name output.json cat output.json - 查看Localstack容器日志,获取Lambda执行时的详细报错:
docker logs <localstack-container-name>
内容的提问来源于stack exchange,提问作者Petra Barus
相关产品推荐
相关产品推荐

