Testcontainers失效时,如何在GitHub Actions Windows 2019代理启动ActiveMQ?
问题背景
Testcontainers在Windows 2019环境下无法正常工作,会抛出以下异常:
java.lang.IllegalStateException: Could not find a valid Docker environment. Please see logs and check configuration at org.testcontainers.dockerclient.DockerClientProviderStrategy.lambda$getFirstValidStrategy$7(DockerClientProviderStrategy.java:256) at java.base/java.util.Optional.orElseThrow(Optional.java:403) at org.testcontainers.dockerclient.DockerClientProviderStrategy.getFirstValidStrategy(DockerClientProviderStrategy.java:247)
需求是在GitHub Actions的windows-2019运行器上,启动JMS代理镜像symptoma/activemq:5.16.2,并让服务在系统的tcp://localhost:12345端口可用。
替代解决方案
GitHub Actions的windows-2019运行器默认预装了Docker,因此可以直接使用Docker命令手动启动容器,绕过Testcontainers的环境检测问题。具体操作如下:
1. 编写GitHub Actions工作流配置
在项目的.github/workflows目录下创建或修改工作流文件(比如test.yml),添加启动ActiveMQ容器的步骤:
jobs: run-tests: runs-on: windows-2019 steps: # 检出代码(根据项目实际情况调整) - name: 检出代码 uses: actions/checkout@v4 # 可选:切换Docker到Linux容器模式(若运行Linux镜像出现问题时启用) - name: 切换Docker至Linux容器模式 run: | & 'C:\Program Files\Docker\Docker\DockerCli.exe' -SwitchLinuxEngine Start-Sleep -Seconds 10 shell: pwsh # 启动ActiveMQ容器,映射端口12345到容器内默认TCP端口61616 - name: 启动ActiveMQ容器 run: | docker run -d -p 12345:61616 --name activemq symptoma/activemq:5.16.2 shell: pwsh # 等待ActiveMQ完全启动,避免测试连接失败 - name: 等待ActiveMQ启动完成 run: | $timeout = 60 $startTime = Get-Date do { # 检查端口是否开放 $portOpen = Test-NetConnection localhost -Port 12345 -InformationLevel Quiet if ($portOpen) { break } Start-Sleep -Seconds 5 } while ((Get-Date) -lt $startTime.AddSeconds($timeout)) if (-not $portOpen) { Write-Error "ActiveMQ启动超时,端口12345未开放" exit 1 } shell: pwsh # 运行测试(示例为Maven测试,根据项目构建工具调整) - name: 执行测试用例 run: ./mvnw test shell: pwsh
2. 关键配置说明
- 端口映射:
-p 12345:61616将主机的12345端口绑定到容器内ActiveMQ的默认TCP通信端口61616,确保测试代码可以通过tcp://localhost:12345连接服务。 - 启动等待逻辑:容器启动需要时间,直接执行测试可能出现连接失败,因此通过循环检查端口状态,等待服务完全就绪后再运行测试。也可以改为检查Docker日志中的启动完成标识(比如匹配
Apache ActiveMQ 5.16.2 started字符串),替换等待步骤的代码:$timeout = 60 $startTime = Get-Date do { $log = docker logs activemq if ($log -match "Apache ActiveMQ 5.16.2 started") { break } Start-Sleep -Seconds 5 } while ((Get-Date) -lt $startTime.AddSeconds($timeout)) - 容器模式切换:若运行Linux镜像出现兼容性问题,启用
切换Docker至Linux容器模式步骤,确保Docker运行在Linux容器模式下。
3. 验证
提交工作流配置到GitHub后,触发Actions运行,查看步骤日志确认ActiveMQ容器正常启动,测试用例可以成功连接tcp://localhost:12345。
内容的提问来源于stack exchange,提问作者diziaq
相关产品推荐
相关产品推荐

