你现在容器里能看到:

/opt/jdk21/bin
/opt/jdk21/lib

但执行:

/opt/jdk21/bin/java

报:

no such file or directory

这通常不是 java 文件不存在,而是 java 依赖的 glibc 动态链接器不存在

原因是:

  • 宿主机 JDK 是 Rocky / EL9 的 OpenJDK,依赖 glibc;
  • gitea/act_runner:0.6.1 很可能是 Alpine / musl 环境;
  • Alpine 容器里没有 /lib64/ld-linux-x86-64.so.2
  • 所以执行 glibc 版 Java 时会报 no such file or directory

推荐方案:不要用 Docker 跑 act_runner,改成宿主机 systemd 跑

你的流水线要用:

  • 宿主机 JDK 21
  • 宿主机 Docker
  • /root/docker/docker-compose-deploy.yml
  • /root/docker/deploy.sh

所以最稳的是让 act_runner 直接运行在宿主机,而不是跑在容器里。

1. 停掉 Docker Runner

docker stop gitea-runner-host
docker rm gitea-runner-host

2. 下载 act_runner 二进制

如果服务器能访问 Gitea 官方下载地址:

cd /usr/local/bin

curl -L -o act_runner \
  https://dl.gitea.com/act_runner/0.6.1/act_runner-0.6.1-linux-amd64

chmod +x /usr/local/bin/act_runner

act_runner --version

如果服务器不能访问外网,可以在本地下载后传到服务器:

scp act_runner root@192.168.0.94:/usr/local/bin/act_runner
ssh root@192.168.0.94 "chmod +x /usr/local/bin/act_runner"

3. 准备 runner 工作目录

mkdir -p /root/docker/runner-host-data
cd /root/docker/runner-host-data

如果之前 Docker Runner 的 /data 挂载就是这个目录,里面应该已经有 .runner 文件:

ls -la /root/docker/runner-host-data

如果能看到 .runner,可以继续复用。

如果没有 .runner,重新注册:

cd /root/docker/runner-host-data

act_runner register \
  --no-interactive \
  --instance http://192.168.0.94:3003 \
  --token <Gitea后台新建Runner的token> \
  --name host-runner \
  --labels ubuntu-latest:host

4. 生成配置文件

cd /root/docker/runner-host-data

act_runner generate-config > config.yaml

5. 创建 systemd 服务

cat > /etc/systemd/system/gitea-act-runner.service <<'EOF'
[Unit]
Description=Gitea Actions Runner
After=network.target docker.service
Requires=docker.service

[Service]
Type=simple
WorkingDirectory=/root/docker/runner-host-data
ExecStart=/usr/local/bin/act_runner daemon --config /root/docker/runner-host-data/config.yaml
Restart=always
RestartSec=5
User=root
Environment=JAVA_HOME=/usr/lib/jvm/java-21-openjdk-21.0.11.0.10-2.el9.x86_64
Environment=PATH=/usr/lib/jvm/java-21-openjdk-21.0.11.0.10-2.el9.x86_64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

[Install]
WantedBy=multi-user.target
EOF

6. 启动 Runner

systemctl daemon-reload
systemctl enable --now gitea-act-runner
systemctl status gitea-act-runner

看日志:

journalctl -u gitea-act-runner -f

应能看到类似:

runner: host-runner, with labels: [ubuntu-latest]
polling tasks

7. 验证环境

java -version
javac -version
docker version
docker compose version
bash /root/docker/deploy.sh status

工作流文件要不要继续用 /opt/jdk21

如果改成宿主机 systemd 跑 runner,就不需要 /opt/jdk21 了,应该把工作流里的:

JAVA_HOME: /opt/jdk21
PATH: /opt/jdk21/bin:...

改回宿主机路径:

JAVA_HOME: /usr/lib/jvm/java-21-openjdk-21.0.11.0.10-2.el9.x86_64
PATH: /usr/lib/jvm/java-21-openjdk-21.0.11.0.10-2.el9.x86_64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

更多推荐