通过github操作中的主机名从操作中访问容器



我在github操作中启动一个docker容器,并尝试从操作访问它。但是该操作无法解析主机名。如何将我的容器添加到与操作相同的docker网络中,并让操作通过其主机名访问它?

steps:
- name: Run Fuseki
run: docker run -p 3030:3030 --name fuseki -d stain/jena-fuseki /jena-fuseki/fuseki-server --file=/staging/aksw.org.nt /aksw
- name: curl
uses: wei/curl@master
with:
args: https://fuseki:3030/aksw

完整的文件可在GitHub上获得。

在shell步骤中混合使用服务、docker操作和简单的旧docker命令时,我的工作流中也有同样的问题。目前,我只看到两种可能的解决方案:

  1. 在主机网络上运行所有内容。服务可以在主机上发布其端口。使用CCD_ 1字段。例如:
services:
redis:
image: redis
ports:
- 6379:6379

在其他步骤和操作中,您可以将--network "host"选项传递给docker。要访问任何容器,只需调用localhost:port。这将从步骤的外壳和容器中进行。这是最简单的解决方案。不幸的是,服务之间可能会发生冲突,我真的不知道这样做对github托管的运行程序是否有任何严重的安全影响。

  1. 您可以在运行程序使用--network ${{ job.container.network }}创建的网络中启动容器。通过传递--cidfile $CID_FILE,您可以将容器的id存储在文件$CID_FILE中。从那里,您可以使用docker检查并输出容器IP地址。通过这样做,即使容器的名称无法解析,您仍然可以使用IP地址从一个容器连接到另一个容器。以下是如何在一个简单的操作中实现它:
name: Docker start container
description: Start a detached container

inputs:
image:
description: The image to use
required: true
name:
description: The container name
required: true
options:
description: Additional options to pass to docker run
required: false
default: ''
command:
description: The command to run
required: false
default: ''

outputs:
cid:
description: Container ID
value: ${{ steps.info.outputs.cid }}
address:
description: Container ID
value: ${{ steps.info.outputs.address }}

runs:
using: composite
steps:
- name: Pull
shell: bash
run: docker pull ${{ inputs.image }}

- name: Run
env:
CID_FILE: ${{ inputs.name }}.cid
shell: bash
run: >
docker run -d
--name ${{ inputs.name }}
--network host
--cidfile $CID_FILE
${{ inputs.options }}
${{ inputs.image }}
${{ inputs.command }}
- name: Info
id: info
shell: bash
run: |
export CID=$(cat $CID_FILE)
export ADDR=$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $CID)
echo "::set-output name=cid::$CID"
echo "::set-output name=address::$ADDR"

这可能更安全,但除了增加的复杂性之外,它还有一个主要缺点:作业启动时不知道容器地址。这意味着您不能使用作业范围的环境变量将这些IP地址中的任何一个传递给其他容器。

我的解决方案是定义一个自定义的docker网络,不使用操作,而是将后续服务作为自己的docker容器运行。这不是很干净,但只要GitHub不允许我指定操作的自定义网络或文档如何使我的自定义容器可用于操作DNS,它就可以工作。

steps:
- name: Create Docker Network
run: docker network create data
- name: Run Fuseki
run: docker run -v ${{ github.workspace }}/.aksw-model:/staging --network data --name fuseki -d stain/jena-fuseki /jena-fuseki/fuseki-server --file=/staging/aksw.org.nt /aksw
- name: curl
run: docker run --rm --network data curlimages/curl:latest http://fuseki:3030/aksw

GitHub上提供了实际完整的文件。

最新更新