GitHub Actions:是否可以从 Docker 容器调用运行器主机?

saw*_*303 4 micronaut github-actions

在下面的 GitHub Actions 工作流程中,我执行了一个 Gradle 构建,该构建针对 Micronaut 应用程序运行集成测试。该应用程序依赖于

  • MariaDB 数据库
  • 和一个security/image:0.1.15
jobs:
  build-test:

    runs-on: ubuntu-latest
    strategy:
      matrix:
        java: [ '15' ]

    services:
      tempoapp-db:
        image: mariadb:10.4.15
        ports:
          - 3306:3306
        env:
          MYSQL_ROOT_PASSWORD: foo
          MYSQL_DATABASE: xoxo
          MYSQL_USER: bar
          MYSQL_PASSWORD: foobar

      security:
        image: security/image:0.1.15
        env:
          JAVA_TOOL_OPTIONS: "-Dcallback.url=http://<what to place here?>:8090"
        credentials:
          username: ${{ secrets.PACKAGES_USER }}
          password: ${{ secrets.PACKAGES_TOKEN }}
        ports:
          - 6000:8080

    steps:
      - name: Check out repository
        uses: actions/checkout@v2

      - name: Set up JDK
        uses: actions/setup-java@v1
        with:
          java-version: ${{ matrix.java }}

      - name: Build and test the application
        run: ./gradlew -s check publishToMavenLocal dockerPrepare

Run Code Online (Sandbox Code Playgroud)

在集成测试阶段,security/image:0.1.15需要 Docker 容器来访问在 Docker 主机上运行的 Micronaut 应用程序。在我的 Docker 桌面环境中,我通常使用主机名host.docker.internal来从容器访问主机。这似乎不适用于 GitHub Actions,因为我收到以下错误

io.micronaut.http.client.exceptions.HttpClientException: Connect Error: host.docker.internal: Name does not resolve
    at io.micronaut.http.client.netty.DefaultHttpClient.lambda$null$34(DefaultHttpClient.java:1119)
    at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578)
    at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:552)
    at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:491)
    at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:616)
Run Code Online (Sandbox Code Playgroud)

有没有办法获取主机的IP地址或主机名?

security:
  image: security/image:0.1.15
  env:
    JAVA_TOOL_OPTIONS: "-Dcallback.url=http://<what to place here?>:8090"
Run Code Online (Sandbox Code Playgroud)

saw*_*303 8

TL;DR:使用 172.17.0.1 访问您的 Docker 主机。

我已经设法解决了我的问题。这个答案给了我正确方向的提示(/sf/answers/4251869821/

AFAIK,在 Docker for Linux(标准发行版)的情况下,主机的 IP 地址将始终为 172.17.0.1(在 docker 的主网络上,请参阅评论以了解更多信息)。

为了验证这一点,我添加了一个额外的工作流程步骤,启动 Alpine Linux 容器并打印 Docker 主机 IP(感谢@Nek

  1. 运行 Alpine Docker
  2. 更新依赖项(安静地)
  3. 安装iproute2包(安静地)
  4. (很好地)显示主机的IP
  5. 删除 docker(感谢--rmarg)
- name: Find Docker Host IP
  uses: addnab/docker-run-action@v1
  with:
    image: alpine:latest
    run: apk update > /dev/null && apk add iproute2 > /dev/null && ip -4 route show default | cut -d' ' -f3
Run Code Online (Sandbox Code Playgroud)

正如您在下面的屏幕截图中看到的,IP 是172.17.0.1

在此输入图像描述

所以我将 IP 添加到容器JAVA_TOOL_OPTIONS的环境变量中security,一切正常。

jobs:
  build-test:

    runs-on: ubuntu-latest
    strategy:
      matrix:
        java: [ '15' ]

    services:
      tempoapp-db:
        image: mariadb:10.4.15
        ports:
          - 3306:3306
        env:
          MYSQL_ROOT_PASSWORD: foo
          MYSQL_DATABASE: xoxo
          MYSQL_USER: bar
          MYSQL_PASSWORD: foobar

      security:
        image: security/image:0.1.15
        env:
          JAVA_TOOL_OPTIONS: "-Dcallback.url=http://172.17.0.1:8090"
        credentials:
          username: ${{ secrets.PACKAGES_USER }}
          password: ${{ secrets.PACKAGES_TOKEN }}
        ports:
          - 6000:8080

    steps:
      - name: Check out repository
        uses: actions/checkout@v2

      - name: Set up JDK
        uses: actions/setup-java@v1
        with:
          java-version: ${{ matrix.java }}

      - name: Build and test the application
        run: ./gradlew -s check publishToMavenLocal dockerPrepare
Run Code Online (Sandbox Code Playgroud)