我只想构建一个 CI 工作流程来创建和推送 quarkus 原生微容器。
几个月来,我断断续续地尝试让它发挥作用。我总是遇到 docker 命令在工作中不起作用的问题。
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
我尝试了很多方法。构建 CI 一次只执行一个命令。就这样调试。使用其他图像来完成工作。使用不同的动作。它只是不会构建那个 Docker 镜像。
它在 gitlab.com 和 github.com 上都不起作用。所以我设置了自己的 Gitea 实例,因为在某些时候我读到这些站点不支持 dind。 AFAIK,我遵循了我能找到的所有方法,关于如何设置动作跑步者与 dind 一起工作。但他们显然不这样做。
我没有主意了。不知道该寻找什么了。我什至不知道我需要告诉你什么,所以你可以帮助我。但我会努力的。
我正在 k8s 集群中使用官方 Gitea Helm Chart 运行 Gitea。
我有一个 act_runner 部署。运行良好并完成应有的工作:
apiVersion: apps/v1
kind: Deployment
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: act-runner
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
spec:
containers:
- command:
- sh
- '-c'
- >-
while ! nc -z localhost 2376 </dev/null; do echo 'waiting for
docker daemon...'; sleep 5; done; /sbin/tini -- /opt/act/run.sh
env:
- name: DOCKER_HOST
value: tcp://localhost:2376
- name: DOCKER_CERT_PATH
value: /certs/client
- name: DOCKER_TLS_VERIFY
value: '1'
- name: GITEA_INSTANCE_URL
value: http://gitea-http:3000
- name: GITEA_RUNNER_REGISTRATION_TOKEN
valueFrom:
secretKeyRef:
key: token
name: runner-secret
image: gitea/act_runner:latest
imagePullPolicy: Always
name: runner
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /certs
name: docker-certs
- mountPath: /data
name: runner-data
- env:
- name: DOCKER_TLS_CERTDIR
value: /certs
image: docker:23.0.6-dind
imagePullPolicy: IfNotPresent
name: daemon
resources: {}
securityContext:
privileged: true
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /certs
name: docker-certs
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- emptyDir: {}
name: docker-certs
- name: runner-data
persistentVolumeClaim:
claimName: act-runner-vol
我的工作流程定义如下所示:
name: Main Push
on:
push:
branches:
- main
jobs:
verify:
name: Verify
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up GraalVM JDK
uses: graalvm/setup-graalvm@v1
with:
java-version: '21'
distribution: 'graalvm'
- name: Set up Maven
uses: stCarolas/setup-maven@v4
with:
maven-version: '3.9.6'
- name: Maven Verify
run: mvn --batch-mode --update-snapshots verify
push_container:
needs: verify
name: Push Container
runs-on: ubuntu-latest
container:
image: catthehacker/ubuntu:act-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up GraalVM JDK
uses: graalvm/setup-graalvm@v1
with:
java-version: '21'
distribution: 'graalvm'
- name: Set up Maven
uses: stCarolas/setup-maven@v4
with:
maven-version: '3.9.6'
- name: Maven Install
run: mvn --batch-mode --update-snapshots install -Dnative -Dquarkus.container-image.build=true -Dquarkus.container-image.push=true -Dquarkus.container-image.username=dscham -Dquarkus.container-image.password=${{ secrets.GITEA_TOKEN }}
一切都贯穿。只是最后,当
maven install
命令构建容器镜像时,由于上述错误而失败。我为这项工作使用了不同的图像。尝试手动安装 docker。使用来自 Action Marketplace 的设置 docker 操作。没有任何办法可以解决这个问题。
将
docker:dind
容器作为服务运行,并使用卷挂载共享套接字。
name: Test Docker on GitHub Actions
on:
pull_request:
push:
branches:
- main
jobs:
push_container:
runs-on: ubuntu-latest
services:
docker:
image: docker:dind
options: --privileged --shm-size=2g
ports:
- 2375:2375
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
container:
image: catthehacker/ubuntu:act-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Test Docker
run: |
docker version
docker info
最后一步检查与 Docker 服务器的连接,并且应该成功运行。