Как запустить podman изнутри контейнера?
Я хочу запустить podman как контейнер для запуска конвейеров CI/CD. Тем не менее, я продолжаю получать эту ошибку из контейнера podman:
$ podman info
ERRO[0000] 'overlay' is not supported over overlayfs
Error: could not get runtime: 'overlay' is not supported over overlayfs: backing file system is unsupported for this graph driver
Я использую плагин Jenkins Kubernetes для написания конвейеров CI/CD, которые работают как контейнеры в кластере Kubernetes. Я был успешным в написании конвейеров, которые используют контейнер Docker-in-Docker для запуска docker build
а также docker push
команды.
Однако запуск Docker-клиента и Docker Daemon внутри контейнера делает среду CI/CD очень раздутой, сложной для настройки и просто не идеальной для работы. Поэтому я решил, что могу использовать podman для создания образов Docker из Dockerfiles без использования толстого демона Docker.
Проблема в том, что podman настолько нов, что я никогда не видел, чтобы кто-нибудь пытался сделать это раньше, и я не достаточно опытный podman, чтобы правильно выполнить это.
Итак, используя инструкции по установке podman для Ubuntu, я создал следующий Dockerfile:
FROM ubuntu:16.04
RUN apt-get update -qq \
&& apt-get install -qq -y software-properties-common uidmap \
&& add-apt-repository -y ppa:projectatomic/ppa \
&& apt-get update -qq \
&& apt-get -qq -y install podman
# To keep it running
CMD tail -f /dev/null
Поэтому я построил изображение и запустил его следующим образом:
# Build
docker build -t podman:ubuntu-16.04 .
# Run
docker run --name podman -d podman:ubuntu-16.04
Затем при выполнении этой команды на работающем контейнере я получаю сообщение об ошибке:
$ docker exec -ti podman bash -c "podman info"
ERRO[0000] 'overlay' is not supported over overlayfs
Error: could not get runtime: 'overlay' is not supported over overlayfs: backing file system is unsupported for this graph driver
Я устанавливаю podman на машину с Ubuntu 16.04, которая у меня была и работала так же podman info
Команда получила ожидаемые результаты:
host:
BuildahVersion: 1.8-dev
Conmon:
package: 'conmon: /usr/libexec/crio/conmon'
path: /usr/libexec/crio/conmon
version: 'conmon version , commit: '
Distribution:
distribution: ubuntu
version: "16.04"
MemFree: 2275770368
MemTotal: 4142137344
OCIRuntime:
package: 'cri-o-runc: /usr/lib/cri-o-runc/sbin/runc'
path: /usr/lib/cri-o-runc/sbin/runc
version: 'runc version spec: 1.0.1-dev'
SwapFree: 2146758656
SwapTotal: 2146758656
arch: amd64
cpus: 2
hostname: jumpbox-4b3620b3
kernel: 4.4.0-141-generic
os: linux
rootless: false
uptime: 222h 46m 33.48s (Approximately 9.25 days)
insecure registries:
registries: []
registries:
registries:
- docker.io
store:
ConfigFile: /etc/containers/storage.conf
ContainerStore:
number: 0
GraphDriverName: overlay
GraphOptions: null
GraphRoot: /var/lib/containers/storage
GraphStatus:
Backing Filesystem: extfs
Native Overlay Diff: "true"
Supports d_type: "true"
Using metacopy: "false"
ImageStore:
number: 15
RunRoot: /var/run/containers/storage
VolumePath: /var/lib/containers/storage/volumes
Кто-нибудь знает, как я могу исправить эту ошибку и заставить podman работать из контейнера?
2 ответа
Ваш Dockerfile должен также установить iptables:
FROM ubuntu:16.04
RUN apt-get update -qq \
&& apt-get install -qq -y software-properties-common uidmap \
&& add-apt-repository -y ppa:projectatomic/ppa \
&& apt-get update -qq \
&& apt-get -qq -y install podman \
&& apt-get install -y iptables
# To keep it running
CMD tail -f /dev/null
Затем выполните команду с:
docker run -ti --rm podman:test bash -c "podman --storage-driver=vfs info"
Это должно дать вам ответ, который вы ожидаете.
Предложение Михая успешно для info
но как только я попробую, например, run --rm docker.io/library/hello-world
Я получаю сообщение об ошибке:
error creating network namespace for container …: mount --make-rshared /var/run/netns failed: "operation not permitted"
failed to mount shm tmpfs "/var/lib/containers/storage/vfs-containers/…/userdata/shm": operation not permitted
Мне удалось решить эту проблему, установив для образа пользователя без полномочий root, а затем запустив контейнер в привилегированном режиме, что противоречит цели упражнения, поскольку DinD уже мог это сделать:
FROM ubuntu:18.04
RUN apt-get update -qq \
&& apt-get install -qq -y software-properties-common uidmap \
&& add-apt-repository -y ppa:projectatomic/ppa \
&& apt-get update -qq \
&& apt-get -qq -y install podman \
&& apt-get install -y iptables
RUN adduser --disabled-login --gecos test test
USER test
ENTRYPOINT ["podman", "--storage-driver=vfs"]
CMD ["info"]
используется как
docker build -t podman:test .
docker run --rm --privileged podman:test run --rm docker.io/library/hello-world
Я попробовал это сам с более разрешительным конфигом (--privileged=true
), с томами хранения, смонтированными с хоста, а также с iptables
установлен в контейнере и смог запустить его (т.е. sudo apt-get install iptables
).
$ podman run -it --rm -v /var/run/containers/storage:/var/run/containers/storage -v /var/lib/containers/storage:/var/lib/containers/storage --storage-driver=overlay --privileged=true mine bash
root@e275668d7c36:/# apt-get install -y -qq iptables
...
root@e275668d7c36:/# podman info
host:
BuildahVersion: 1.8-dev
Conmon:
package: 'conmon: /usr/libexec/crio/conmon'
path: /usr/libexec/crio/conmon
version: 'conmon version , commit: '
Distribution:
distribution: ubuntu
version: "16.04"
MemFree: 71659520
MemTotal: 482099200
OCIRuntime:
package: 'cri-o-runc: /usr/lib/cri-o-runc/sbin/runc'
path: /usr/lib/cri-o-runc/sbin/runc
version: 'runc version spec: 1.0.1-dev'
SwapFree: 0
SwapTotal: 0
arch: amd64
cpus: 2
hostname: e275668d7c36
kernel: 4.15.0-1035-aws
os: linux
rootless: false
uptime: 315h 17m 53s (Approximately 13.12 days)
insecure registries:
registries: []
registries:
registries: []
store:
ConfigFile: /etc/containers/storage.conf
ContainerStore:
number: 2
GraphDriverName: overlay
GraphOptions: null
GraphRoot: /var/lib/containers/storage
GraphStatus:
Backing Filesystem: extfs
Native Overlay Diff: "true"
Supports d_type: "true"
Using metacopy: "false"
ImageStore:
number: 4
RunRoot: /var/run/containers/storage
VolumePath: /var/lib/containers/storage/volumes
Если вы хотите использовать docker
Вы можете использовать --privileged
флаг тоже.
Имейте в виду, что существуют другие инструменты, специально предназначенные для создания контейнеров, и некоторые из них без привилегированного режима:
- Kaniko
- IMG
- Buildkit
- Buildah (Компаньон Подману)
- Базель (с модулем сборки контейнера)
- Собственные шаблоны сборки контейнеров