docker 我如何在GitHub操作中等待容器健康?

x33g5p2x  于 2023-03-01  发布在  Docker
关注(0)|答案(5)|浏览(152)

我正在使用GitHub动作做一些自动化测试,我的应用程序是在Docker中开发的。

name: Docker Image CI

on:
  push:
    branches: [ master]
  pull_request:
    branches: [ master]

jobs:

  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Build the Docker image
      run: docker-compose build

    - name: up mysql and apache container runs
      run: docker-compose up -d 

    - name: install dependencies
      run: docker exec  myapp php composer.phar install
  
    - name: show running container
      run: docker ps 

    - name: run unit test
      run: docker exec  myapp ./vendor/bin/phpunit

在步骤“show running container”中,我可以看到所有容器都在运行,但MySQL的状态为(health:因此,我的单元测试用例都失败了,因为它需要连接到MySQL。所以我可以知道是否有一种方法可以只在MySQL容器的状态正常时启动单元用例吗?

j5fpnvbx

j5fpnvbx1#

我想提供一个解决方案,不是一个聪明的,但它需要最低限度的配置和准备去,只是使用GitHub行动的睡眠。

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - name: Sleep for 30 seconds
      uses: jakejarvis/wait-action@master
      with:
        time: '30s'

假设:您的Mysql服务器将在30秒内启动并运行。

zsbz8rwp

zsbz8rwp2#

你可以使用 * thegabriele 97/dockercompose-health-action*

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - name: Check services healthiness
        uses: thegabriele97/dockercompose-health-action@main
        with:
          timeout: '60'
          workdir: 'src'
aij0ehis

aij0ehis3#

正如documentation所述:
若要处理此问题,请将应用程序设计为在失败后尝试重新建立与数据库的连接。如果应用程序重试连接,它最终可以连接到数据库。
如果你现在不能实现这个,你可以写一些简单的脚本,在数据库上无限期地尝试一个简单的语句。一旦脚本成功,你退出循环并开始你的单元测试。检查我提供的文档链接,你会发现有这样的脚本(wait-for-it.sh)的例子。

5n0oy7gb

5n0oy7gb4#

我的方法是用途:
1.在我docker-compose.yml文件中:

healthcheck:
  test: curl --fail http://localhost/ping || exit 1
  interval: 2s
  retries: 10
  start_period: 10s
  timeout: 10s

1.在我的Github操作工作流程中:

- name: Wait for healthchecks
  run: timeout 60s sh -c 'until docker ps | grep <CONTAINER_NAME> | grep -q healthy; do echo "Waiting for container to be healthy..."; sleep 2; done'
zbdgwd5y

zbdgwd5y5#

如文件所述:
在Linux和macOS运行程序上,使用sleep命令:

- name: Sleep for 30 seconds
  run: sleep 30s
  shell: bash

在Windows runner上,使用"开始-睡眠"命令:

- name: Sleep for 30 seconds
  run: Start-Sleep -s 30
  shell: powershell

相关问题