如何解决GitHub Actions:是否可以从 Docker 容器调用运行器主机?
在下面的 GitHub 操作工作流中,我执行了一个 Gradle 构建,该构建针对 Micronaut 应用程序运行集成测试。此应用程序依赖于
- 一个 MariaDB 数据库
- 和一个
import discord,datetime,time from discord.ext import commands @commands.command(pass_context=True) async def uptime(self,ctx): current_time = time.time() difference = int(round(current_time - start_time)) text = str(datetime.timedelta(seconds=difference)) embed = discord.Embed(colour=0xc8dc6c) embed.add_field(name="Uptime",value=text) embed.set_footer(text="<bot name>") try: await ctx.send(embed=embed) except discord.HTTPException: await ctx.send("Current uptime: " + text)
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
Docker 容器来访问在 Docker 主机上运行的 Micronaut 应用程序。在我的 Docker 桌面环境中,我通常使用主机名 security/image:0.1.15
从容器访问主机。这似乎不适用于 GitHub Actions,因为我收到以下错误
host.docker.internal
有没有办法获取主机的 IP 地址或主机名?
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)
解决方法
我已经设法解决了我的问题。这个答案给了我一个正确方向的提示 (https://stackoverflow.com/a/60740997/960875)
AFAIK,在 Docker for Linux(标准发行版)的情况下,主机的 IP 地址将始终为 172.17.0.1(在 docker 的主网络上,请参阅评论以了解更多信息)。
为了验证这一点,我添加了一个额外的工作流程步骤,用于启动 Alpine Linux 容器并打印 Docker 主机 ip(感谢 @Nek)
- 运行 Alpine Docker
- 更新依赖项(安静地)
- 安装
iproute2
包(安静) - (很好地)显示主机的 ip
- 移除泊坞窗(感谢
--rm
arg)
- 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
正如您在下面的屏幕截图中看到的,IP 是 172.17.0.1
。
所以我将 IP 添加到我的 JAVA_TOOL_OPTIONS
容器的 security
env 变量中,一切正常。
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。