Вариант запуска тестов testcontainers через podman в gitlab CI/CD

Речь про продукт https://testcontainers.com/. Дошли руки наконец переделать CI с тестами (используют внутри фреймворк testcontainers),  testcontainers требует наличия docker daemon, чтобы запускать контейнеры и прогонять тесты.  У нас Gitalb имеет раннеры с docker executor, поэтому некоторое время для запуска таких тестов использовался проброс docker.sock внутрь контейнера:

# cat /etc/gitlab-runner/config.toml
...
    [runners.docker]
    volumes = ["/var/run/docker.sock:/var/run/docker.sock", ...

 

Всем понятно, что это ОЧЕНЬ не безопасно, т.к. дает возможность получить рутовый доступ к машине с раннером из среды CI. Проблему можно сильно уменьшить, если раннер сделать не уровня instance level, а сделать доступным только для определенных реп, где в CI используется testcontainers. 

Лучше всего избавится от проброса docker.sock, в качестве варианта решения проблемы приходит на помощь софт podman.

1. ставим podman на линукс сервер

2. ставим доп пакеты - uidmap и passt

3. создаем юзера podman (или любого другого)

4. создаем systemd service:

# systemctl cat podman-api
/etc/systemd/system/podman-api.service
[Install]
WantedBy=multi-user.target

[Service]
Environment="HOME=/home/podman"
ExecStart=podman system service -t 0 unix:///home/podman/podman.sock
Group=podman
Restart=always
StandardError=journal
StandardOutput=journal
Type=simple
User=podman

[Unit]
Description=Run podman sock with podman user rights
systemctl start podman-api
systemdctl enable podman-api

 

 5. В конфиге config.toml раннера меняем:

[runners.docker]
...
  volumes = ["/home/podman/podman.sock:/var/run/docker.sock"

 

Если всё было сделано верно, то код тестов менять не придется, podman имеет такое же API, что и у docker (бОльшей частью). Из возможных проблем - может понадобиться указать полное имя образов (т.к. в отличие от docker, podman не смотрит по дефолту в регистри docker,io) 

Пример логов:

journalctl -f -u podman-api
...
podman[3724210]: time="2026-01-30T11:55:00+03:00" level=warning msg="IdleTracker: StateClosed transition by connection marked un-managed" X-Reference-Id=0xc000011138
podman[3724210]: Trying to pull docker.io/library/mysql:5.7.21...
podman[3724210]: Getting image source signatures
podman[3724210]: Copying blob sha256:38680a9b47a889afdad30e2b778870f30b2adfb670996da71d32fef815446b32
podman[3724210]: Copying blob sha256:c5317a34eddd75b2b48e525137d7d7adc1cbba157fe58eb2fc60bf93b68c7b28
podman[3724210]: Copying blob sha256:4c732aa0eb1bf8ee7a7dfdb2acdb3d1579110241fe47747d2b14a77e2cb504e2
...
podman[3724210]: 2026-01-30 11:55:01.439923525 +0300 MSK m=+287.566402543 image pull  docker.io/library/mysql:5.7.21
podman[3724210]: 2026-01-30 11:55:18.477399695 +0300 MSK m=+304.603878696 volume create 3602b74eea868b243f29019ee4b41f09d63de3afbd10943acc4213668855a68a
podman[3724210]: 2026-01-30 11:55:18.488450879 +0300 MSK m=+304.614929896 container create 7d046192e872cbb695f0086ac2d7ebc246b8523b7f457e4e8782785063cd54a6 (image=docker.io/library/mysql:5.7.21, name=blissful_panini, org.testcontainers=true, org.testcontainers.lang=java, org.testcontainers.version=1.19.1, org.testcontainers.sessionId=XXX)

 

Please publish modules in offcanvas position.