Я запускаю 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