Доступ к контейнеру по имени хоста в действиях github из действия

Я запускаю контейнер докеров в своем действии github и пытаюсь получить к нему доступ из действия. Но действие не может разрешить имя хоста. Как добавить мой контейнер в ту же сеть докеров, что и действие, и позволить действию получить к нему доступ по имени хоста?

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.


person white_gecko    schedule 16.12.2020    source источник
comment
Отвечает ли это на ваш вопрос? Служба elasticsearch не отображается при запуске тестов   -  person riQQ    schedule 16.12.2020
comment
Нет, я также пытался получить доступ к localhost: 3030, но не смог.   -  person white_gecko    schedule 16.12.2020
comment
Я добавил ссылку на файл в репо   -  person white_gecko    schedule 17.12.2020


Ответы (2)


У меня такая же проблема в моих рабочих процессах при работе с сочетанием сервисов, действий докеров и простых старых команд докеров на этапах оболочки. На данный момент я вижу только два возможных обходных пути:

  1. Запускаем все в хост-сети. Сервисы могут публиковать свои порты на хосте. используя поле ports. Например:
   services:
      redis:
        image: redis
        ports:
          - 6379:6379

В других ваших шагах и действиях вы можете передать параметр --network "host" в docker. Чтобы получить доступ к любому из контейнеров, просто вызовите localhost:port. Это будет работать как из оболочки ваших шагов, так и из контейнеров. Это самое простое решение. К сожалению, у вас могут быть конфликты между сервисами, и я действительно не знаю, есть ли какие-либо серьезные последствия для безопасности при выполнении этого для бегунов, размещенных на github.

  1. Вы можете запускать свои контейнеры в сети, созданной бегуном, используя --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
comment
Выполняются ли действия и в хост-сети? Могут ли они получить доступ к моим старым добрым контейнерам в первом случае? - person white_gecko; 18.12.2020
comment
@white_gecko извините, я должен был сделать это яснее. Действия Docker не будут выполняться в сети хоста, но они смогут достичь контейнеров в сети хоста, получив доступ к localhost. Сами по себе они не будут доступны на localhost из других контейнеров. - person ITChap; 18.12.2020

Мое решение - определить настраиваемую сеть докеров и не использовать действия, а запускать последующие службы как контейнеры докеров и свои собственные. Это не очень чисто, но работает до тех пор, пока 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.

person white_gecko    schedule 17.12.2020
comment
Спасибо за ответ, теперь все работает нормально - person wajdi_jurry; 03.05.2021