Running Containers
Cordium Workspaces can run nested containers with Podman. This makes it possible to use a Workspace not only as a shell environment, but also as a complete development or automation environment capable of running databases, web servers, etc. Here is a rather detailed example:
1spec:
2 image:
3 registry:
4 url: golang:1.23-bookworm
5
6 repository:
7 url: https://github.com/example/data-platform
8 cloneOptions:
9 branch: main
10 depth: 1
11
12 runtime:
13 envVars:
14 - key: POSTGRES_DSN
15 value: postgres://postgres:password@localhost:5432/app?sslmode=disable
16 - key: MYSQL_DSN
17 value: root:password@tcp(localhost:3306)/app
18 - key: REDIS_ADDR
19 value: localhost:6379
20 - key: CLICKHOUSE_DSN
21 value: clickhouse://octelium:octelium@localhost:9000/default
22
23 tasks:
24 - name: install-tools
25 type: ON_CREATE
26 runAsRoot: true
27 run: |
28 apt-get update
29 apt-get install -y \
30 podman \
31 git \
32 curl \
33 jq \
34 postgresql-client \
35 default-mysql-client \
36 redis-tools \
37 build-essential \
38 && rm -rf /var/lib/apt/lists/*
39
40 - name: download-go-dependencies
41 type: ON_CREATE
42 workingDir: /workspace/repo
43 run: |
44 go mod download
45 onFailure: ON_FAILURE_ABORT
46
47 - name: start-postgres
48 type: POST_START
49 run: |
50 sudo podman rm -f cordium-postgres 2>/dev/null || true
51
52 sudo podman run \
53 --name cordium-postgres \
54 --net host \
55 -e POSTGRES_PASSWORD=password \
56 -e POSTGRES_DB=app \
57 -d docker.io/postgres:16
58
59 until pg_isready -h localhost -p 5432 -U postgres; do
60 sleep 1
61 done
62
63 - name: start-mariadb
64 type: POST_START
65 run: |
66 sudo podman rm -f cordium-mariadb 2>/dev/null || true
67
68 sudo podman run \
69 --name cordium-mariadb \
70 --net host \
71 -e MARIADB_ROOT_PASSWORD=password \
72 -e MARIADB_DATABASE=app \
73 -d docker.io/mariadb:11
74
75 until mysqladmin ping -h 127.0.0.1 -P 3306 -uroot -ppassword --silent; do
76 sleep 1
77 done
78
79 - name: start-redis
80 type: POST_START
81 run: |
82 sudo podman rm -f cordium-redis 2>/dev/null || true
83
84 sudo podman run \
85 --name cordium-redis \
86 --net host \
87 -d docker.io/redis:7
88
89 until redis-cli -h localhost ping | grep -q PONG; do
90 sleep 1
91 done
92
93 - name: start-clickhouse
94 type: POST_START
95 run: |
96 sudo podman rm -f cordium-clickhouse 2>/dev/null || true
97
98 sudo podman run \
99 --name cordium-clickhouse \
100 --net host \
101 -e CLICKHOUSE_USER=octelium \
102 -e CLICKHOUSE_PASSWORD=octelium \
103 -d docker.io/clickhouse/clickhouse-server:latest
104
105 until curl -fsS http://localhost:8123/ping | grep -q Ok; do
106 sleep 1
107 done
108
109 - name: run-integration-tests
110 type: POST_START
111 workingDir: /workspace/repo
112 run: |
113 go test ./... -count=1
114 onFailure: ON_FAILURE_ABORT
115
116 - name: start-service
117 type: POST_START
118 workingDir: /workspace/repo
119 isBackground: true
120 run: |
121 go run ./cmd/server
122
123 - name: stop-containers
124 type: PRE_STOP
125 run: |
126 sudo podman rm -f \
127 cordium-postgres \
128 cordium-mariadb \
129 cordium-redis \
130 cordium-clickhouse \
131 2>/dev/null || true
132
133 limit:
134 cpu:
135 millicores: 8000
136 memory:
137 megabytes: 16384
138 storage:
139 megabytes: 50000You can also use Cordium to build Docker/OCI images and push them to registries (e.g. ghcr). Here is an example:
1spec:
2 vars:
3 - name: REPO_URL
4 value: https://github.com/myorg/my-service
5 - name: BRANCH
6 value: main
7 - name: IMAGE
8 value: ghcr.io/myorg/my-service
9 - name: TAG
10 value: latest
11 - name: DOCKERFILE
12 value: Dockerfile
13 - name: CONTEXT
14 value: .
15
16 image:
17 registry:
18 url: ubuntu:24.04
19
20 repository:
21 url: ${{ vars.REPO_URL }}
22 cloneOptions:
23 branch: ${{ vars.BRANCH }}
24 depth: 1
25 singleBranch: true
26 disableLazyUnshallow: true
27
28 runtime:
29 envVars:
30 - key: REGISTRY
31 value: ghcr.io
32 - key: REGISTRY_USERNAME
33 value: myorg
34 - key: REGISTRY_TOKEN
35 fromSecret: ghcr-token
36
37 tasks:
38 - name: install-podman
39 type: ON_CREATE
40 runAsRoot: true
41 run: |
42 apt-get update
43 apt-get install -y \
44 ca-certificates \
45 curl \
46 git \
47 jq \
48 podman \
49 buildah \
50 skopeo \
51 && rm -rf /var/lib/apt/lists/*
52
53 - name: registry-login
54 type: ON_CREATE
55 run: |
56 echo "${REGISTRY_TOKEN}" | sudo podman login "${REGISTRY}" \
57 --username "${REGISTRY_USERNAME}" \
58 --password-stdin
59
60 - name: build-image
61 type: ON_CREATE
62 workingDir: /workspace/repo
63 run: |
64 sudo podman build \
65 --pull=always \
66 --file "${{ vars.DOCKERFILE }}" \
67 --tag "${{ vars.IMAGE }}:${{ vars.TAG }}" \
68 "${{ vars.CONTEXT }}"
69
70 - name: push-image
71 type: ON_CREATE
72 run: |
73 sudo podman push "${{ vars.IMAGE }}:${{ vars.TAG }}"
74
75 - name: inspect-pushed-image
76 type: ON_CREATE
77 run: |
78 skopeo inspect "docker://${{ vars.IMAGE }}:${{ vars.TAG }}" | jq .
79
80 autoStop: true
81
82 limit:
83 cpu:
84 millicores: 4000
85 memory:
86 megabytes: 8192
87 storage:
88 megabytes: 30000