Как запустить podman изнутри контейнера? - PullRequest
4 голосов
/ 08 мая 2019

Я хочу запустить 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 build и docker push используется контейнер Docker-in-Docker.

Однако запуск клиента Docker и демона Docker внутри контейнера делает 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

Iустановить 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 работать из контейнера?

Ответы [ 3 ]

2 голосов
/ 08 мая 2019

Ваш 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"

Это должно дать ожидаемый ответ.

1 голос
/ 08 мая 2019

Я попробовал это сам с более разрешающей конфигурацией (--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.

Имейте в виду, что существуют другие инструменты, специально предназначенные длястроить контейнеры и некоторые из них без привилегированного режима:

0 голосов
/ 02 июля 2019

Предложение от mihai успешно для 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
...