gpt4 book ai didi

docker - Jenkins Docker镜像-仅将 `jobs`文件夹放入命名卷中时出现权限问题

转载 作者:行者123 更新时间:2023-12-02 18:36:42 24 4
gpt4 key购买 nike

我通过在自己的Dockerfile中扩展the official image在Docker容器中运行Jenkins。

该页面的顶部建议将整个$JENKINS_HOME文件夹放入一个命名卷中,以使通过UI进行的更改在容器重新启动和重新创建时得以保留。

但是,我不希望整个$JENKINS_HOME文件夹成为该卷的一部分,而只是$JENKINS_HOME/jobs文件夹。原因如下:

  • 插件是由install_plugins.sh脚本在镜像构建过程as documented here中从基础镜像中设置的。
  • 所有其他配置将由configuration-as-code plugin从头开始在每个镜像上创建。
  • 不会在每个镜像构建中从头开始重新创建作业,因此应保留在命名卷中。

  • 结果,我像这样启动了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用户?

    编辑:
    我的 Dockerfile减少到最低限度是这样的。但是,我不怀疑这是根本原因,因为在运行 jenkins/jenkins:lts股票图像时会发生相同的事情,如下所示:
    docker run \
    -p 8080:8080 \
    -p 50000:50000 \
    -v jenkins-jobs:/var/jenkins_home/jobs \
    jenkins/jenkins:lts

    基本图像的 Dockerfile可以找到 on 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

    最佳答案

    可怕的解决方法,可以解决问题,直到找到更好的解决方案为止:

  • 将以下行添加到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进程。

    关于docker - Jenkins Docker镜像-仅将 `jobs`文件夹放入命名卷中时出现权限问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55045101/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com