У меня такая же проблема в моих рабочих процессах при работе с сочетанием сервисов, действий докеров и простых старых команд докеров на этапах оболочки. На данный момент я вижу только два возможных обходных пути:
- Запускаем все в хост-сети. Сервисы могут публиковать свои порты на хосте. используя поле
ports
. Например:
services:
redis:
image: redis
ports:
- 6379:6379
В других ваших шагах и действиях вы можете передать параметр --network "host"
в docker. Чтобы получить доступ к любому из контейнеров, просто вызовите localhost:port
. Это будет работать как из оболочки ваших шагов, так и из контейнеров. Это самое простое решение. К сожалению, у вас могут быть конфликты между сервисами, и я действительно не знаю, есть ли какие-либо серьезные последствия для безопасности при выполнении этого для бегунов, размещенных на github.
- Вы можете запускать свои контейнеры в сети, созданной бегуном, используя
--network ${{ job.container.network }}
. Передав --cidfile $CID_FILE
, вы можете сохранить идентификатор контейнера в файле $CID_FILE
. Оттуда вы можете использовать docker inspect и вывести 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-адресов в другие контейнеры, используя переменные среды для всего задания.
person
ITChap
schedule
17.12.2020