Quais são as configurações de permissão corretas ao executar o Docker em um pipeline Jenkins?

11

Estou tentando montar um novo pipeline de jenkins para testar novas solicitações pull ao nosso código. Estou usando o docker com a ubuntu:14.04imagem para simular nosso ambiente de produção.

Aqui está um exemplo de trabalho mínimo:

#jenkinsfile
stage('Checkout and provision'){
docker.image('ubuntu:14.04').withRun('-u root'){
    checkout scm
    sh 'chmod -R 770 ./'
    sh './init-script.sh'
    }
}

e

 #init-script.sh
 sudo add-apt-repository ppa:ondrej/php
 sudo apt-get update -y
 sudo apt-get dist-upgrade -y
 sudo apt-get install \
    apache2 \
    php \
    php-mysql \
    php-xml \
    libapache2-mod-auth-mysql \
    libapache2-mod-php \
    php5-curl \
    zip \
    htop \
    supervisor \
    mailutils \
    git \
    build-essential -y
 sudo apt-get autoremove -y

E o /etc/sudoersarquivo para o contêiner é o seguinte:

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults:jenkins !requiretty

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

jenkins ALL=(ALL:ALL) NOPASSWD:ALL

O problema que estou tendo é que a janela de encaixe não está sendo executada como root e estou retendo o ID do usuário de Jenkins da máquina host. Isso dificulta o sudo.

Tentei adicionar o usuário jenkins ao /etc/passwdarquivo de contêineres e executá-lo chmodnesse arquivo, mas nem sequer tenho as permissões para fazer isso no jenkinsfile.

Com essa configuração, eu deveria ser o usuário root. No entanto, vejo Error: must run as rootse não uso sudoou sudo: no tty present and no askpass program specifiedse faço.

Existe uma maneira correta de lidar com esta situação? Idealmente a partir do jenkinsfile; Gostaria de evitar a criação de um adicional, Dockerfilese possível, pois esse será um diferencial adicional entre teste e produção.

tobassist
fonte
Mente em compartilhar seu arquivo jenkinsfile e unit.sh? Sons principalmente um palpite neste momento ...
Tensibai
Essa é uma pergunta difícil, tentando fazer as pessoas resolverem sua lição de casa. Realmente existem fóruns de Jenkins para esse tipo de coisa. Sua pergunta deve realmente ser feita em um formulário que pode ser encontrado em uma pesquisa no Google quando houver um problema semelhante e ser útil a alguém que não seja você como uma boa pergunta para este site.
Jiri Klouda 4/04
Venho pesquisando isso há dias e vasculhei os documentos de Jenkins. Ainda estou para encontrar uma solução. Se estiver faltando uma terminologia para encontrar as respostas necessárias, informe-me. Atualizei a pergunta para deixar mais claro o que estou perguntando, mas não concordo que isso seja 'difícil' ou 'lição de casa'.
perfil completo de Tobassist
Eu atualizei a questão com um exemplo mínimo
tobassist
1
Talvez isso possa ser útil : wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin (acho que -u root quando você não é root não funciona, ele altera o nome de usuário, mas não o ID do usuário). Você terá que preparar sua imagem com um usuário de jenkins autorizado a sudo sem senha.
Tensibai

Respostas:

12

Portanto, após uma sessão de depuração no bate-papo, o necessário é permitir que o usuário que executa o jenkins seja capaz de obter uma sudo dockersenha no host do docker.

Um arquivo típico de sudoers no ubuntu pode estar em /etc/sudoers.d/jenkins

jenkins_user ALL=(ALL) NOPASSWD:ALL

Esteja avisado de que isso permite jenkins_userexecutar como root sem senha qualquer comando, um arquivo melhor deve ser:

jenkins_user ALL=(ALL) NOPASSWD:/full/path/to/docker
jenkins_user ALL=(ALL) NOPASSWD:<other needed command to be run as root>

Isso permitirá iniciar o contêiner como root e, como tal, concede todos os direitos dentro do próprio contêiner executando como uid 0.

Recursos úteis usados ​​de lado:

Tensibai
fonte
2

Na verdade, é uma má idéia executar o Docker como root. O que você deve fazer é adicionar o usuário Jenkins ao grupo Docker. sudo usermod -aG docker jenkins. Isso evitará abrir brechas de segurança desnecessárias e permitirá que Jenkins faça tudo o que precisa com o Docker, incluindo a execução como raiz dentro dos contêineres. Eu faço isso regularmente com minhas compilações, usando isso como uma amostra:

stage ('Build Docker Image') {
  steps {
    script {
      // Build the Docker image for compiling
      dockerImage = docker.build("myapp:v1")
    }
  }
}
stage ('Run UnitTests') {
  steps {
    script {
      dockerImage.inside("-itu root") {
        sh(script: "nosetests app-test.py --verbose")
      }
    }
  }
}
primetheus
fonte