Pipenv блокируется при запуске с Docker в Gitlab

#python #docker #gitlab #gitlab-ci #pipenv

#python #docker #gitlab #gitlab-ci #pipenv

Вопрос:

Я создал этот простой проект в Gitlab:

https://gitlab.com/PequeX/deleteme

С Pip-файлом, который устанавливает только пару пакетов:

 [[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]
pytest = "*"

[packages]
requests = "*"

[requires]
python_version = "3.7"
  

И очень простой .gitlab-ci.yml файл:

 image: peque/python-devel

before_script:
  - pipenv sync --dev

python36:
  script:
    - pipenv run pytest
  

Существует также автоматически созданный Pipfile.заблокируйте файл. Который я не буду вставлять здесь, поскольку это не очень интересно.

Теперь проблема в том, что Gitlab, похоже, блокируется при вызове pipenv sync :

https://gitlab.com/PequeX/deleteme/-/jobs/171273142

В журнале нет выходных данных и нет ошибки. Он просто блокируется навсегда. А затем, в конечном итоге, истекает время ожидания (потому что Gitlab не позволит вам запускать конвейер вечно).

Что не так или как я мог успешно выполнить pipenv sync ? Обратите внимание, что я хотел бы продолжать использовать один и тот же peque/python-devel образ из Docker Hub, поскольку мне нужно установить несколько версий Python для моих конвейеров.

Обновить

Попытался сбросить CI переменную, как предлагает @Hernan Garcia в своем ответе, но безуспешно:

Я также пытался с pipenv shell , как предлагает @Hernan Garcia в своих комментариях, но безуспешно:

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

1. Можете ли вы добавить --verbose ? pipenv.readthedocs.io/en/latest/#pipenv-sync

Ответ №1:

Как упоминалось в другом ответе, определение пустой CI переменной решит проблему зависания сборки.

Тогда вторая проблема, с которой вы столкнетесь из-за того, что вы не можете найти pytest , и это связано с тем, что в образе docker отсутствует which пакет, и это делает pipenv невозможным поиск pytest.

Конечный файл gitlab-ci.yml должен быть похож на следующий:

 image: peque/python-devel

variables:
  CI: ""

before_script:
  - pipenv sync --dev
  - yum install -y which

python36:
  script:
    - pipenv run pytest
  

И конечный результат будет:

 $ pipenv run pytest
============================= test session starts ==============================
platform linux -- Python 3.7.2, pytest-4.3.0, py-1.8.0, pluggy-0.9.0
rootdir: /builds/mostafahussein/deleteme, inifile:
collected 0 items

========================= no tests ran in 0.01 seconds =========================
  


Что касается этой проблемы:

 termios.error: (25, 'Inappropriate ioctl for device')
  

Это связано с тем, что для запуска без возникновения вышеуказанной ошибки pipenv shell требуется tty , однако GitLab CI не предоставляет tty, поскольку, насколько я знаю, нет пользовательских вводов. Поэтому будет лучше использовать первый метод, который pipenv run .

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

1. Исправляет проблему, спасибо. Все еще нужно выяснить, в чем разница между этим (возможно, слишком) сокращенным примером и реальным репозиторием, который теперь (после установки which ) завершается сбоем с ошибкой «сброс ядра», как только я запускаю pipenv команду. :'(

2. @Peque Я извлек текущий образ docker, и все работает как ожидалось, устанавливать его не нужно, потому что я обнаружил, что он уже существует, как я вижу, вы загрузили новый образ b7c96e8d2b98 . В чем ваша текущая проблема, поскольку я не могу воспроизвести ошибку «сброс ядра»

3. Да, я обновил изображение недостающим which , спасибо. Мне нужно немного поработать над попыткой создать сокращенный пример, который воспроизводил бы «сброс ядра». Я пока приму ваш ответ, поскольку в настоящее время он устраняет все воспроизводимые проблемы.

4. @Peque пожалуйста, не забудьте добавить награду, поскольку она должна быть добавлена вручную, и проголосуйте за ответ.

5. Я уже поддержал ответ. Я все еще думаю, присуждать награду или нет. Если я не назначу его, он будет разделен между вами и @hernangarcia, который также помог с CI проблемой переменной. ^^

Ответ №2:

Я мог бы исправить это, используя этот обходной путь:
https://github.com/pypa/pipenv/issues/3534#issuecomment-464510351

Добавьте следующее в свой .gitlab-ci.yml файл, чтобы отменить CI переменную:

 variables:
    CI: ""
  

Проверьте это успешное задание:
https://gitlab.com/hernandanielg/deleteme/-/jobs/171342796

😉

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

1. Я попробую это обходное решение, спасибо! Клянусь, я искал pipenv проблемы, но я думаю, что я искал слово «блок», а не «застрял», и эта проблема не возникла… :-/

2. Я немного обновил репозиторий, фактически пытаясь использовать какой-то установленный пакет . Теперь он не застревает, но говорит, что не может найти (предположительно правильно) установленный пакет. Есть идеи?

3. если я это сделаю, pipenv shell и тогда pytest это сработает… для использования pipenv run pytest кажется, проблема с pip

4. Проблема с pip а не pipenv в этом случае? Следует ли сообщать об этом? Я всегда думал, что pipenv shell xxx это эквивалентно pipenv run xxx .

5. Я не знаю наверняка, но я попробовал использовать образ контейнера, который вы используете, и он тоже дал сбой, так что это вообще не связано с gitlab-ci

Ответ №3:

Вам необходимо изменить разрешение файла. сделайте его доступным для чтения и записи с помощью chmod 777 команды. который предоставит файлу полные разрешения на чтение и запись

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

1. Какой файл вы имеете в виду?

2. весь файл docker изменяет режим

3. Вы имеете в виду Dockerfile ? Это используется только для генерации образа, который уже находится в Docker Hub, как это может быть связано с проблемой в Gitlab?

4. основная проблема с файлом docker заключается в том, что у него нет полного разрешения на выполнение задания. когда я работал над aws batch, я столкнулся с этой проблемой, поэтому файл, который находится внутри файла docker, а также весь образ docker предоставляют полный доступ для чтения и записи. т. е. Chmod 777

5. перед запуском в gitlab предоставьте полный доступ к образу docker