Как установить pip в образе докера с шагом jenkins pipline? - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть Dockerfile :

FROM python:3.7

CMD ["/bin/bash"]

и этот Jenkinsfile :

pipeline {
agent {
    dockerfile {
        filename 'Dockerfile'
    }
}
stages {
    stage('Install') {
        steps {
            sh 'pip install --upgrade pip'
        }
    }
}

Это приводит к следующей ошибке:

The directory '/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Collecting pip
  Downloading https://files.pythonhosted.org/packages/d8/f3/413bab4ff08e1fc4828dfc59996d721917df8e8583ea85385d51125dceff/pip-19.0.3-py2.py3-none-any.whl (1.4MB)
Installing collected packages: pip
  Found existing installation: pip 19.0.2
Uninstalling pip-19.0.2:
Could not install packages due to an EnvironmentError: [Errno 13] 
Permission denied: '/usr/local/bin/pip'
Consider using the `--user` option or check the permissions.

Я попытался использовать --user, но безуспешно.

Мне повезло, используя args --user 0:0 в объявлении docker jenkinsfile, но это создает каталоги и файлы, принадлежащиеroot, который не может быть удален пользователем Jenkins при следующем запуске.

Я не хочу делать pip install в Dockerfile, так как в действительности на шаге установки вместо файла упрощения запускается make-файлЯ использовал выше, что я хочу использовать в других контекстах.

Я также видел совет изменить HOME environment var, и это, кажется, исправляет первые 2 предупреждения о том, что родительский директой не принадлежит текущемупользователь, но не Errno 13 часть.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Как я уже упоминал в этом комментарии , решение должно заключаться в добавлении надлежащего пользователя внутри контейнера.Jenkins использует 984:984 для uid / gid на моем компьютере (но может отличаться на вашем - войдите на хост, на котором работает Jenkins и выполните sudo -u jenkins id -a для их обнаружения), поэтому вам нужно скопировать его в контейнер, который должен бытьвыполняется Jenkins:

FROM python:3.7

RUN mkdir /home/jenkins
RUN groupadd -g 984 jenkins
RUN useradd -r -u 984 -g jenkins -d /home/jenkins jenkins
RUN chown jenkins:jenkins /home/jenkins
USER jenkins
WORKDIR /home/jenkins

CMD ["/bin/bash"]

Конечно, поскольку вы больше не являетесь пользователем root в контейнере, либо создайте виртуальную среду:

$ docker run --rm -it jenkins/python /bin/bash
jenkins@d0dc87c39810:~$ python -m venv myenv
jenkins@d0dc87c39810:~$ source myenv/bin/activate
jenkins@d0dc87c39810:~$ pip install numpy

или используйте --user аргумент:

$ docker run --rm -it jenkins/python /bin/bash
jenkins@d0dc87c39810:~$ pip install --user --upgrade pip
jenkins@d0dc87c39810:~$ pip install --user numpy

и т. Д.


В качестве альтернативы вы можете (но в большинстве случаев не должны) входить в контейнер как root, но с jenkins group:

$ docker run --user 0:984 ...

Таким образом, хотя измененные файлы все равно изменят владельца, их групповое владение останется без изменений, поэтому Jenkins сможет очистить файлы (илиВы можете сделать это самостоятельно, через

sh 'rm -f modified_file'

в Jenkinsfile.

0 голосов
/ 22 февраля 2019

Похоже, проблема больше связана с пользователями.Когда вы работаете с докером, агент работает с пользователем root, а на вашем этапе cmd работает с соответствующим пользователем, настроенным в Jenkins (это root?).

Создайте аналогичного пользователя в файле Docker и назначьте контейнер, запущенный этому пользователю.

Dockerfile

   FROM python:3.7

   ARG Jenkins_user=XXXXXX

   RUN useradd -ms /bin/bash $Jenkins_user

   USER $Jenkins_user

   CMD ["/bin/bash"] 

Отредактировано: здесь Jenkins_user будет с тем, какой pip cmd работает в контейнере.Для проверки пользователя вы можете поместить

sh 'echo $ USER'

в разделе стадии установки.А затем обновите Dokerfile, указав точного пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...