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.04
imagem 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/sudoers
arquivo 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/passwd
arquivo de contêineres e executá-lo chmod
nesse 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 root
se não uso sudo
ou sudo: no tty present and no askpass program specified
se 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, Dockerfile
se possível, pois esse será um diferencial adicional entre teste e produção.
Respostas:
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 docker
senha no host do docker.Um arquivo típico de sudoers no ubuntu pode estar em
/etc/sudoers.d/jenkins
Esteja avisado de que isso permite
jenkins_user
executar como root sem senha qualquer comando, um arquivo melhor deve ser: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:
sudo
no Linux?fonte
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:fonte