|
1 | | -# alpine-nested-qemu-docker |
| 1 | +# github-runner-nested-docker |
| 2 | + |
| 3 | +This is a modified **alpine-nested-qemu-docker** for running **[myoung34/github-runner:ubuntu-jammy](https://github.com/myoung34/docker-github-actions-runner)** in a Docker container without privileged mode. |
| 4 | + |
| 5 | +## How to ? |
| 6 | + |
| 7 | +This is a sample Kubernetes manifest for deploying it: |
| 8 | + |
| 9 | +```yaml |
| 10 | +--- |
| 11 | +apiVersion: v1 |
| 12 | +kind: Secret |
| 13 | +metadata: |
| 14 | + name: heartbeat |
| 15 | + namespace: sandbox-github-runner |
| 16 | +type: Opaque |
| 17 | +stringData: |
| 18 | + now: "19820002" |
| 19 | +--- |
| 20 | +apiVersion: v1 |
| 21 | +kind: ConfigMap |
| 22 | +metadata: |
| 23 | + name: entrypoint |
| 24 | + namespace: sandbox-github-runner |
| 25 | +data: |
| 26 | + entrypoint: | |
| 27 | + #!/bin/sh |
| 28 | + while (! docker stats --no-stream ); do |
| 29 | + # Docker takes a few seconds to initialize |
| 30 | + echo "Waiting for Docker to launch..." |
| 31 | + sleep $((`od -vAn -N2 -tu2 < /dev/urandom` %15)) |
| 32 | + done |
| 33 | + docker run -e ACCESS_TOKEN=kfNKfcRR7rYAUebw31o= -e ORG_NAME=herokukms -e RUNNER_GROUP=Docker-runners -e RUNNER_SCOPE=org -e RUNNER_NAME_PREFIX=heroku -e TIMESTAMP=19820002 myoung34/github-runner:ubuntu-jammy |
| 34 | +--- |
| 35 | +apiVersion: apps/v1 |
| 36 | +#kind: Deployment |
| 37 | +kind: StatefulSet |
| 38 | +metadata: |
| 39 | + name: herokukms-runner |
| 40 | + namespace: sandbox-github-runner |
| 41 | + labels: |
| 42 | + app: herokukms-runner |
| 43 | +spec: |
| 44 | + replicas: 9 |
| 45 | + #strategy: |
| 46 | + # type: Recreate |
| 47 | + selector: |
| 48 | + matchLabels: |
| 49 | + app: herokukms-runner |
| 50 | + template: |
| 51 | + metadata: |
| 52 | + labels: |
| 53 | + app: herokukms-runner |
| 54 | + spec: |
| 55 | + containers: |
| 56 | + - name: herokukms-runner |
| 57 | + image: herokukms/github-runner-nested:1.0.0 |
| 58 | + volumeMounts: |
| 59 | + - name: entrypoint |
| 60 | + mountPath: /ext |
| 61 | + env: |
| 62 | + - name: ACCESS_TOKEN |
| 63 | + value: kfNKfcRR7rYAUebw31o= |
| 64 | + - name: ORG_NAME |
| 65 | + value: herokukms |
| 66 | + - name: RUNNER_GROUP |
| 67 | + value: Docker-runners |
| 68 | + - name: RUNNER_SCOPE |
| 69 | + value: org |
| 70 | + - name: TIMESTAMP |
| 71 | + value: "19820002" |
| 72 | + - name: RANDOM_RUNNER_SUFFIX |
| 73 | + value: "hostname" |
| 74 | + - name: QEMU_CPU |
| 75 | + value: "1" |
| 76 | + - name: QEMU_RAM |
| 77 | + value: "2048" |
| 78 | + - name: UPDATED |
| 79 | + value: "19820002" |
| 80 | +# securityContext: |
| 81 | +# privileged: true |
| 82 | + volumes: |
| 83 | + - name: entrypoint |
| 84 | + configMap: |
| 85 | + name: entrypoint |
| 86 | + defaultMode: 0777 |
| 87 | +``` |
| 88 | +
|
| 89 | +## alpine-nested-qemu-docker |
| 90 | +
|
2 | 91 | ## Why this strange idea ? |
| 92 | +
|
3 | 93 | Because most of docker container can't run in a privileged environment and so cannot run Docker. |
4 | | -This Docker image runs an Alpine linux in a QEMU virtual machine so the docker daemon runs like in a real machine. |
| 94 | +This Docker image runs an Alpine linux in a QEMU virtual machine so the docker daemon runs like in a real machine. |
| 95 | +
|
| 96 | +## How to |
5 | 97 |
|
6 | | -# How to |
7 | 98 | ```sh |
8 | 99 | docker run -it -v ./entrypoint:/ext/entrypoint eltorio/alpine-nested-qemu-docker |
9 | 100 | ``` |
| 101 | + |
10 | 102 | `./entrypoint` is a mandatory shell script. It will be run after docker and ntpd services in the Alpine virtual machine |
11 | 103 |
|
12 | | -# Demo |
| 104 | +## Demo |
| 105 | + |
13 | 106 | For launching busybox:latest in the non privileged image: |
| 107 | + |
14 | 108 | ```sh |
15 | 109 | make build |
16 | 110 | make demo |
17 | 111 | ``` |
18 | 112 |
|
19 | | -# Connect to nested Alpine |
| 113 | +## Connect to nested Alpine |
| 114 | + |
20 | 115 | While connected to the qemu container you can reach the nested Alpine vm with |
| 116 | + |
21 | 117 | ```sh |
22 | 118 | telnet localhost |
23 | 119 | ``` |
| 120 | + |
24 | 121 | hit enter and connect as root |
25 | 122 | For leaving telnet hit CTRL+$ and quit |
26 | 123 |
|
27 | | -# Kubernetes sample deployement |
| 124 | +## Kubernetes sample deployement |
| 125 | + |
28 | 126 | This launch 10 replicas of busybox:latest on Kubernetes |
| 127 | + |
29 | 128 | ```yaml |
30 | 129 | --- |
31 | 130 | apiVersion: v1 |
|
83 | 182 | configMap: |
84 | 183 | name: entrypoint |
85 | 184 | defaultMode: 0777 |
86 | | -``` |
| 185 | +``` |
0 commit comments