Сборка контейнера Singularity с использованием GitLab CI

#docker #continuous-integration #gitlab-ci #virtualization #singularity-container

# #docker #непрерывная интеграция #gitlab-ci #виртуализация #сингулярность-контейнер

Вопрос:

Я хочу создать образ сингулярности в GitLab CI. К сожалению, официальные контейнеры терпят неудачу с:

 Running with gitlab-runner 13.5.0 (ece86343) on gitlab-ci d6913e69
Preparing the "docker" executor
Using Docker executor with image quay.io/singularity/singularity:v3.7.0 ...
Pulling docker image quay.io/singularity/singularity:v3.7.0 ...
Using docker image sha256:46d3827bfb2f5088e2960dd7103986adf90f2e5b4cbea9eeb0b0eacfe10e3420 for quay.io/singularity/singularity:v3.7.0 with digest quay.io/singularity/singularity@sha256:def886335e36f47854c121be0ce0c70b2ff06d9381fe8b3d1894fee689615624 ...
Preparing environment
Running on runner-d6913e69-project-2906-concurrent-0 via <gitlab.url>...
Getting source from Git repository
Fetching changes with git depth set to 50...
Reinitialized existing Git repository in <repo-path>
Checking out 708cc829 as master...
Skipping Git submodules setup
Executing "step_script" stage of the job script
Error: unknown command "sh" for "singularity"
 

сразу же в начале, при использовании такого задания, как это:

 build-singularity:
  image: quay.io/singularity/singularity:v3.7.0
  stage: singularity
  script:
    - build reproduction/pipeline/semrepro-singularity/semrepro-singularity.sif reproduction/pipeline/semrepro-singularity/semrepro-singularity.def
  only:
    changes:
      - reproduction/pipeline/semrepro-singularity/semrepro-singularity.def
      - reproduction/pipeline/semrepro-singularity/assets/mirrorlist
      - .gitlab/ci/build-semrepo-singularity.yml
  artifacts:
    paths:
      - reproduction/pipeline/semrepro-singularity/semrepro-singularity.sif
    expire_in: 1 hour
  interruptible: true
 

Мне кажется, что GitLab пытается использовать оболочку, которой не существует? Как они должны работать? В официальном примере они используют специальную версию вызываемого образа docker -gitlab , но, к сожалению, она больше не доступна. Есть какие-нибудь идеи? Я не могу себе представить, что невозможно создать контейнеры сингулярности в CI? Заранее большое спасибо!

РЕДАКТИРОВАТЬ: Согласно ответу @tsnowlan, переопределение точки входа устраняет вышеуказанную проблему. Однако теперь сборка завершается неудачно с:

 singularity build semrepro-singularity.sif semrepro-singularity.def
INFO:    Starting build...
INFO:    Downloading library image
84.1MiB / 84.1MiB [========================================] 100 % 28.7 MiB/s 0s
ERROR:   unpackSIF failed: root filesystem extraction failed: extract command failed: ERROR  : Failed to create user namespace: not allowed to create user namespace: exit status 1
FATAL:   While performing build: packer failed to pack: root filesystem extraction failed: extract command failed: ERROR  : Failed to create user namespace: not allowed to create user namespace: exit status 1
Cleaning up file based variables
ERROR: Job failed: exit code 1
 

Есть идеи?

Ответ №1:

Вам нужно немного доработать его, чтобы он хорошо работал с gitlab CI. Самый простой способ, который я нашел, — это заблокировать точку входа docker и сделать так, чтобы этап сценария был полной командой сборки singularity. Мы используем это для создания наших изображений singularity с версией v3.6.4, но оно должно работать и с версией v3.7.0.

например,

 build-singularity:
  image: 
    name: quay.io/singularity/singularity:v3.7.0
    entrypoint: [""]
  stage: singularity
  script:
    - singularity build reproduction/pipeline/semrepro-singularity/semrepro-singularity.sif reproduction/pipeline/semrepro-singularity/semrepro-singularity.def
  ...
 

редактировать: используемый gitlab-runner также должен privileged быть включен. Это значение по умолчанию для gitlab.com общие бегуны, но если вы используете свои собственные бегуны, вам нужно убедиться, что это задано в их конфигурации.

Комментарии:

1. Большое спасибо! Действительно, это устраняет первоначальную проблему, из-за которой сборка даже не начиналась! Однако это наталкивается на другую проблему, с которой я сталкивался раньше при попытке создать самодельный образ docker. Я думал, что это может быть проблемой с моим пользовательским докером, но, похоже, это не так. Сбой сборки ERROR: unpackSIF failed: root filesystem extraction failed: extract command failed: ERROR : Failed to create user namespace: not allowed to create user namespace . Есть идеи?

2. Я забыл sudo. Используйте это, и это должно сработать

3. Подождите, нет, он должен быть запущен от имени root. Это странно

4. Ага, да, я думаю, что это все. Мы запускаем наши собственные gitlab-раннеры, которые запускаются с. --privileged Хотя похоже, что общие бегуны тоже должны быть: docs.gitlab.com/13.6/ee/user/gitlab_com /…

5. Ах, если вы работаете на управляемом экземпляре, вам не повезет, пока они не включат привилегированный режим в runner. Это сложное требование для docker-in-docker или singularity-in-docker