Изображение Jenkins Docker - проблемы с разрешениями, когда папка `jobs` помещается только в именованный том - PullRequest
1 голос
/ 07 марта 2019

Я запускаю Jenkins в контейнере Docker, расширяя официальное изображение в моем собственном Dockerfile.

В верхней части этой страницы рекомендуется поместить целое $JENKINS_HOMEпапку в именованный том, чтобы изменения, сделанные через пользовательский интерфейс, сохранялись при перезапусках и повторных созданиях контейнера.

Однако я не хочу, чтобы вся папка $JENKINS_HOME была частью этого тома, а только$JENKINS_HOME/jobs папка.Причины этого:

  • Плагины устанавливаются сценарием install_plugins.sh из базового образа в процессе сборки образа , как описано здесь .
  • Все остальные конфигурации будут создаваться с нуля для каждой сборки образа с помощью плагина конфигурация как код .
  • Только задания не воссоздаются заново с каждой сборки образа и, следовательно, должнысохраняются в именованном томе.

В результате я запускаю контейнер Jenkins следующим образом:

docker run \
    -p 8080:8080 \
    -p 50000:50000 \
    -v jenkins-jobs:/var/jenkins_home/jobs \
    my-custom-jenkins-image

Контейнеру теперь не удается правильно начать с ошибок permission denied в журналах.Проверка разрешений внутри $JENKINS_HOME через docker exec container_name_or_id ls -ahl /var/jenkins_home показывает, что $JENKINS_HOME/jobs теперь принадлежит root вместо пользователя jenkins, которому принадлежат все остальные файлы и подкаталоги там, и самого $JENKINS_HOME.

Интересно, что при помещении всей папки $JENKINS_HOME в именованный том все файлы и подпапки в ней будут правильно принадлежать пользователю jenkins.

Как я могу поместить только папку jobs вименованный том и убедитесь, что он принадлежит jenkins пользователю внутри контейнера?

edit: My Dockerfile, урезанный до минимума, выглядит следующим образом.Однако я не подозреваю, что это является основной причиной, поскольку при запуске jenkins/jenkins:lts стокового изображения происходит то же самое, что и в:

docker run \
    -p 8080:8080 \
    -p 50000:50000 \
    -v jenkins-jobs:/var/jenkins_home/jobs \
    jenkins/jenkins:lts

Dockerfile базового изображения можетможно найти на GitHub .

FROM jenkins/jenkins:lts

USER root

# install plugins
COPY plugins.txt /usr/share/jenkins/ref/plugins.txt
RUN /usr/local/bin/install-plugins.sh < /usr/share/jenkins/ref/plugins.txt

# Configuration as code plugin
# The configuration file must be stored outside of the Jenkins home directory
# because this is mounted as a volume - consequently, changes to the file in
# the image would not make it into the container which would override it with
# the previous version from the volume.
ENV CASC_JENKINS_CONFIG=/run/jenkins.yaml
COPY --chown=jenkins:jenkins jenkins.yaml /run/jenkins.yaml

# don't run plugin and admin user setup wizard at first run
ENV JAVA_OPTS="-Djenkins.install.runSetupWizard=false"

USER jenkins

1 Ответ

0 голосов
/ 07 марта 2019

Ужасный обходной путь, который устраняет проблему, пока не найдется лучшее решение:

  1. Добавьте следующие строки в Dockerfile:
FROM jenkins/jenkins:lts

USER root

# Install additional tools and plugins, set up configuration etc.

# We need the gosu tool to step down from the root user to an unprivileged
# user as part of the entrypoint script.
# See further: https://github.com/tianon/gosu
RUN apt-get -y update && apt-get -y install gosu

# Note that we stay the root user and do not step down to the jenkins user yet.
COPY fix_volume_ownership.sh /usr/local/bin/fix_volume_ownership.sh
ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/fix_volume_ownership.sh"]

Создатьfix_volume_ownership.sh:

#!/bin/bash

# This script is run by the root user in order to have the privileges to change
# ownership of the jobs directory. The jobs directory is mounted as a named
# volume and otherwise is owned by the root user so that the jenkins user
# cannot write into it.
#
# "gosu" finally steps down from the root user to the jenkins user since we
# do not want to run the Jenkins process with root privileges.
#
# /usr/local/bin/jenkins.sh is the original entrypoint script from the base image.

chown -R jenkins:jenkins /var/jenkins_home/jobs
gosu jenkins /usr/local/bin/jenkins.sh

Теперь docker exec container_name_or_id ls -ahl /var/jenkins_home покажет, что подпапка jobs правильно принадлежит пользователю jenkins.Кроме того, docker exec container_name_or_id ps aux покажет, что процесс Jenkins выполняется пользователем jenkins.

...