Permission denied trying to mkdir in build with jenkins and kubernetes

Necesito crear una carpeta en una de las etapas de una construcción en Jenkins, pero estoy recibiendo un error de permiso cuando intenta ejecutar mkdir. Dockerfile:

FROM debian:latest

USER root

WORKDIR /root
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install -y gnupg2

RUN DEBIAN_FRONTEND="noninteractive" apt install -y apt-transport-https ca-certificates software-properties-common curl git jq wget unzip

RUN curl -s https://storage.googleapis.com/golang/go1.15.6.linux-amd64.tar.gz| tar -v -C /usr/local -xz

RUN export PATH=$PATH:/usr/local/go/bin

#
# Docker
#
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN apt-key fingerprint 0EBFCD88
RUN add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
RUN apt-get update
RUN apt-get install -y docker-ce docker-ce-cli containerd.io

ENV PATH=$PATH:/usr/local/go/bin
RUN export PATH=$PATH:/usr/local/go/bin

WORKDIR /app/src/

Etapa de Jenkinsfile:

stage('Restore') {

                try {
                    timeout(time: 10, unit: 'MINUTES') {

                        dir('.') {
                            sh "mv * /root/go/src/Proj/"
                        }

                        dir('/root/go/src/Proj/') {
                             sh "mkdir ./${repoName}"
                        }
                        
                    }
                } catch (Exception err) {
                    cleanWS()
                    error("[FAILED]: " + err.getMessage())
                }
            }

El comando mv funciona bien, pero cuando se trata de mkdir, me da este error:

java.nio.file.AccessDeniedException: /root/go/src

¿Alguien sabe cómo puedo establecer este permiso?

Pregunta hecha hace 3 años, 5 meses, 0 días - Por syntaxsorcerer


2 Respuestas:

  • El error "java.nio.file.AccessDeniedException: /root/go/src" se debe a que el usuario que ejecuta el contenedor Docker en tu Jenkinsfile no tiene permisos para crear directorios en la ruta "/root/go/src".

    Una forma de solucionar este problema sería modificar el Dockerfile para cambiar el propietario y los permisos de la carpeta "/root/go/src" antes de la etapa en la que intentas crear el directorio en tu Jenkinsfile.

    Puedes agregar las siguientes líneas al final de tu Dockerfile antes de la última instrucción "WORKDIR /app/src/":

    Dockerfile
    RUN mkdir -p /root/go/src/
    RUN chown -R : /root/go/src/
    

    Reemplaza <nombre_usuario> y <nombre_grupo> con el usuario y grupo que tenga permisos para crear directorios en esa ruta.

    Luego, en tu Jenkinsfile, puedes modificar la etapa de "Restore" para asegurarte de que estás trabajando con el usuario adecuado. Por ejemplo:

    groovy
    stage('Restore') {
        agent {
            docker {
                image 'nombre_de_tu_imagen'
                args '-u root'
            }
        }
        steps {
            script {
                try {
                    timeout(time: 10, unit: 'MINUTES') {
                        dir('.') {
                            sh "mv * /root/go/src/Proj/"
                        }
                        dir('/root/go/src/Proj/') {
                            sh "mkdir ./${repoName}"
                        }
                    }
                } catch (Exception err) {
                    cleanWS()
                    error("[FAILED]: " + err.getMessage())
                }
            }
        }
    }
    

    Con estos cambios, deberías poder crear la carpeta sin problemas en la ruta "/root/go/src" durante la ejecución de tu construcción en Jenkins. ¡Espero que esto te ayude a solucionar tu problema!

    Respondida el Dec 17, 2020 a las 12:47 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error de "permiso denegado" al intentar ejecutar mkdir en un entorno de Docker de Jenkins y Kubernetes generalmente indica que el usuario que ejecuta el comando no tiene los permisos necesarios para crear directorios en la ruta especificada.

    Aquí hay algunas posibles soluciones:

    • Ejecutar como root: Ejecuta el comando `mkdir` como usuario root dentro del contenedor de Docker. Puedes hacer esto usando el comando `RUN` en tu Dockerfile:

    dockerfile
       RUN mkdir -p /root/go/src/Proj/${repoName}
       

    • Montar un volumen: Monta un volumen del host en el contenedor de Docker y crea el directorio en ese volumen.

    En tu Jenkinsfile:

    groovy
       container('my-container') {
           volume '/host/path/to/dir:/root/go/src/Proj'
       }

    stage('Restore') { try { timeout(time: 10, unit: 'MINUTES') {

    dir('.') { sh "mv /root/go/src/Proj/" }

    dir('/root/go/src/Proj/') { sh "mkdir ./${repoName}" }

    } } catch (Exception err) { cleanWS() error("[FAILED]: " + err.getMessage()) } }

    Asegúrate de que el usuario que ejecuta Jenkins tenga permisos de lectura y escritura en el directorio host montado.

    • Usar un usuario diferente: Crea un usuario diferente dentro del contenedor de Docker que tenga los permisos necesarios.

    En tu Dockerfile:

    dockerfile
       RUN useradd -m -u 1000 myuser
       RUN chown -R myuser:myuser /root/go/src
       RUN su - myuser
       

    En tu Jenkinsfile:

    groovy
       container('my-container') {
           user 'myuser'
       }

    stage('Restore') { try { timeout(time: 10, unit: 'MINUTES') {

    dir('.') { sh "mv /root/go/src/Proj/" }

    dir('/root/go/src/Proj/') { sh "mkdir ./${repoName}" }

    } } catch (Exception err) { cleanWS() error("[FAILED]: " + err.getMessage()) } }

    Una vez que hayas implementado una de estas soluciones, deberías poder crear directorios en la ruta /root/go/src/Proj/ sin errores de permiso.

    Respondida el Dec 17, 2020 a las 12:59 - por Gemini

    Votos positivos: 0 | Votos negativos: 0