На данный момент для меня остается не ясна причина, по которой Docker игнорирует внешний DNS, и как это исправить. Но я нашел решение для DroneCI, которое позволяет мне на данный момент решить текущую задачу.
1. Все контейнеры должны быть подключены к одной сети, в моем случае это одна внешняя сеть
2. Узнать ip адрес unbound внутри сети docker, и указать его для всех сервисов, как DNS
3. Для drone-runner установить переменную среды
DRONE_RUNNER_NETWORKS, указывающую на вашу внешнюю сеть. Это предоставит возможность воркерам работать внутри вашей сети.
4. Устанавливать в пайплайнах адрес dns, чтобы можно было локальные имена резолвились внутри кнтейнера
5. Отключить операцию clone, которая по умолчанию включена в каждом пайплайне, и отвечает за скачивание репозитория в DroneCI. Потому что установить IP адрес DNS, для этой операции нельзя.
kind: pipeline
type: docker
name: default
clone:
disable: true
steps:
- name: check-dns
image: ubuntu:20.04
dns:
- 172.22.0.3
commands:
- apt-get update && apt-get install -y dnsutils iputils-ping
- set -e
- echo "Проверка доступности DNS-сервера"
- ping -c 4 172.16.5.69 || { echo "Ping failed for 172.16.5.69"; exit 1; }
- ping -c 4 172.22.0.3 || { echo "Ping failed for 172.22.0.3"; exit 1; }
- echo "Проверка разрешения имени через DNS"
- nslookup gitea.example.lan || { echo "nslookup failed"; exit 1; }
- dig @172.22.0.3 gitea.example.lan || { echo "dig failed"; exit 1; }
- nslookup gitea.example.lan 172.22.0.3 || { echo "nslookup with DNS failed"; exit 1; }
Дополнение:
Чтобы починить Gitea Actions необходимо:
1. Раннеру добавить переменную окружения
ACT_RUNNER_DOCKER_NETWORK, указывающую, на вашу внешнюю сеть. Это позволит запускать воркеры, как и в случае с DroneCI, в той же сети, в которой у вас настроен DNS.
2. Установить контейнеру опцию --dns
name: DNS Check Workflow
run-name: ${{ gitea.actor }} is running the DNS Check workflow
permissions:
actions: read
checks: read
pull-requests: read
contents: read
packages: read
on: [push]
jobs:
Check-DNS:
runs-on: ubuntu-latest
container:
image: ubuntu:latest
options: --dns 172.22.0.3
steps:
- name: Install tools
run: |
echo " Installing tools"
apt-get update
apt-get install -y dnsutils iputils-ping curl git
echo "✅ Installation completed: dnsutils, iputils-ping, curl"
- name: Install Node.js
run: |
echo " Installing Node"
curl -fsSL https://deb.nodesource.com/setup_16.x | bash -
apt-get install -y nodejs || { echo "❌ Node.js installation failed"; exit 1; }
node --version
echo "✅ Installation completed: nodejs"
- name: Check DNS Server Accessibility
run: |
echo " Checking DNS server accessibility"
ping -c 4 172.16.5.69 || { echo "❌ Ping failed for 172.16.5.69"; exit 1; }
ping -c 4 172.22.0.3 || { echo "❌ Ping failed for 172.22.0.3"; exit 1; }
- name: Test DNS Resolution
run: |
echo " Testing DNS resolution"
nslookup gitea.oogis.lan || { echo "❌ nslookup failed"; exit 1; }
dig @172.22.0.3 gitea.oogis.lan || { echo "❌ dig failed"; exit 1; }
nslookup gitea.oogis.lan 172.22.0.3 || { echo "❌ nslookup with specified DNS failed"; exit 1; }
- run: echo " The job was automatically triggered by a ${{ gitea.event_name }} event."
- run: echo " This job is now running on a ${{ runner.os }} server hosted by Gitea!"
- run: echo " The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
- name: Check out repository code
uses: actions/checkout@v4
with:
token: ${{ secrets.GITEA_TOKEN }}
- run: echo " The ${{ gitea.repository }} repository has been cloned to the runner."
- run: echo "️ The workflow is now ready to test your code on the runner."
- name: List files in the repository
run: |
ls ${{ gitea.workspace }}
- run: echo " This job's status is ${{ job.status }}."