26/06/2026

Linux – podman as gitlab-runer

  1. install gitlab-runner
  2. install podman
  3. Configure podman
  4. configure runner
  5. test

install gitlab-runner

Gerekli hersey güncel olarak : https://docs.gitlab.com/runner/install/linux-repository/

curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" -o script.deb.sh
bash script.deb.sh
apt install gitlab-runner -y
loginctl enable-linger gitlab-runner
# Add the User ID range
usermod --add-subuids 700000-765536 gitlab-runner
# Add the Group ID range (Double check it's active)
usermod --add-subgids 700000-765536 gitlab-runner
gitlab-runner register  --url https://gitlab.mydomain.com  --token glrt-portakalordakalbubir Tokendir.01.1a0zqyumw

Install Podman

Gerekli bilgiler : https://podman.io/docs/installation

apt install podman -y
systemctl enable podman.socket
systemctl --user --machine=gitlab-runner@ enable --now podman.socket
su - gitlab-runner
  echo 'export XDG_RUNTIME_DIR=/run/user/$(id -u)' >> .bash_profile
  export XDG_RUNTIME_DIR=/run/user/999
  systemctl --user status podman.socket
  exit
vim /etc/gitlab-runner/config.toml

burada config.toml a HOST satirini ekliyoruz. ancak burada ki user/999 bulmak icin gitlab-runner useri olarak daha önce girdigimiz systemctl –user status podman.socket komutunda ki Listen satirina bakiyoruz.
Listen: /run/user/999/podman/podman.sock (Stream)

  [runners.docker]
    host = "unix:///run/user/999/podman/podman.sock"
    tls_verify = false
    image = "ubuntu:latest"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]
    volume_keep = false
    shm_size = 0
    network_mtu = 0

sonra devam

systemctl restart gitlab-runner
modprobe fuse
apt -y install fuse3
apt install qemu-guest-agent -y
su - gitlab-runner
  podman system migrate
  podman run --entrypoint /bin/sh -ti --rm quay.io/buildah/stable:v1.43.0
  exit

Buraya kadar bana en azindan yabanci pek cok komut girdim ve bunlarin aciklamalarini asagida ki gibi ögrendim.

En bastan baslayalim. Amacimiz rootless ancak container olusturabilen secure bir gitlab-runner sahibi olmak cünkü DinD root yetkileri istiyor ve bu secure degil. Ana platformumuz ubuntu 24.04 VM.

gitlab-runneri kurarken :

  1. loginctl enable-linger gitlab-runner
    bu komut userin session inin acik kalmasini böylece runneri sürekli calisir tutuyor. Cok da elzem degil.
  2. uid – gid
    • usermod –add-subuids 700000-765536 gitlab-runner
    • usermod –add-subgids 700000-765536 gitlab-runner
      Bu iki komut sayasinde container icindeki user ve group id leri 70000 den baslayan ID’lere maplanierler. bunun sebebi normalde dockerda container icindeki uid ve gid host taki uid ve gid ye maplenir dolayisiyla uid si 0 olan bir container host üzerinde de “root” yetkisine sahip olur ancak tamda bu podman ile önlemek istedigimiz sey. ancak podman simdi nereye mapleyecegini bilemeyecektir cünkü 1-1 mapleme olmayacaksa nasil olacak tanimlanmasi gerekmektedir. yoksa
      cannot set up user namespaces
    • Permission denied (cannot chown)
    • failed to register layer: ERRO[0000]
      gibi error mesajlari ile sistem calismaz. bu ayar sayesinde Container icinde uid si 0 olan host üzerinde 70000 ve gid si 1000 olan host üzerinde 701000 gibi gid alacak ve maplenebilecektir-
  3. export XDG_RUNTIME_DIR=/run/user/999
    XDG_RUNTIME_DIR bir standard runtime degiskenidir ve programlarin kücük datalari saklayabilecekleri hizli bir folderdir. /run RAM de bulunur ve cok hizlidir ancak reboot ile gider. ve sadece user 999 a izin verdigimizden baskasi (root) haric okuyamaz. Bunu kullandik böylece PODMAN ve systemd ye nereyi kullanmalari gerektigini göstermis olduk.

Podmani kurarken

modprobe fuse
apt -y install fuse3

Containerlarda bulunan layerlar docker tarafindan overlay kullanilarak olusturulur ancak docker bunu root yetkisi ile yapar. Podman bunun icin kernelin native overlayini kullanamaz. fuse3 kullandigimizda podman otomatik olarak fuse-overlayfs e gecer ve userspace icinde podman image layerlarini olusturabilir ve root yetkilerine ihtiyac duymaz.
bu olmadan gitlab pipeline da image kullanmak istedigmizde hata aliriz
unrecognized image format or cannot mount overlay: permission denied

Daha sonra mutlaka config.toml altina “devices = [“/dev/fuse”]” ekliyoruz.

 [runners.docker]
    host = "unix:///run/user/999/podman/podman.sock"
    tls_verify = false
    image = "ubuntu:latest"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]
    volume_keep = false
    shm_size = 0
    network_mtu = 0
    devices = ["/dev/fuse"]