Я создал рабочий процесс на сервере GitHub Enterprise. Я хочу собрать и отправить контейнер с помощью docker/build-push-action, и перед отправкой я хочу запустить в контейнере несколько тестов.
Мой файл рабочего процесса выглядит так:
name: Docker Image Build & Push
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
workflow_dispatch:
permissions:
contents: read
packages: write
jobs:
build:
name: Build & Push Container
runs-on: [self-hosted, linux, docker]
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Docker Meta
id: meta
uses: docker/metadata-action@v5
with:
images: |
registry.private/user/image
tags: |
type=schedule
type=ref,event=branch
type=ref,event=pr
type=semver,pattern = {{version}}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
with:
driver: docker-container
- name: Login to Registry
uses: docker/login-action@v3
with:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
registry: registry.private
- name: Docker Build
uses: docker/build-push-action@v5
with:
push: false
context: .devcontainer
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
- name: Run some commands in the container
uses: addnab/docker-run-action@v3
with:
image: registry.private/user/image
run: whoami && pwd
# Put here the step for the push
Все работает нормально, кроме выполнения действия addnab/docker-run-action@v3. Я получил следующее сообщение об ошибке:
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
Я нашел эту проблему на GitHub, но рабочего решения не нашлось.
Я бы предпочел использовать многоразовое действие из маркетплейса. Если это невозможно, мне придется использовать команду docker run .... Но поскольку я хочу работать с многострочными командами, использовать многократное действие будет проще.
...yaml-multiline.info . Весь этот многоразовый экшен — всего лишь тонкая обертка вокруг… docker run. Зачем быть обязанным за исправления какой-то случайной третьей стороне?
вы пытаетесь запустить докер внутри докера, он же dind. Это возможно, но вам нужно смонтировать сокет docker /var/run/docker.sock:/var/run/docker.sock. Пример: контейнер: изображение: параметры образа докера: -v /var/run/docker.sock:/var /run/docker.sock
Акция из addnab/docker-run-action делает именно такой вариант. В моем случае такое монтирование произошло, но сокет докера по-прежнему недоступен.


Как @jonrsharpe упомянул в комментариях, запуск докера работает довольно хорошо, в том числе и с многострочными командами.
.yaml-multiline.info. Все это многоразовое действие — всего лишь тонкая оболочка вокруг… запуска докера.
Мой шаг теперь выглядит так:
- name: Run Tests in Container
run: >
docker run ${{ needs.build.outputs.tag }} bash -c "
whoami &&
whoami &&
ls -la"
Вам нужны какие-то действия третьей стороны для этого? Просто
- run: docker run ....