Construcción de una imagen Docker en un pipeline de Jenkins
- Francisco Javier Huete
- Implantacion
- March 9, 2025
Índice
Para crear una imagen Docker desde un pipeline de Jenkins es necesario conectar este servicio a la cuenta de DockerHub a la que debe subir la imagen. Para ello, en el menú Administrar Jenkins -> Credenciales -> Global -> Add Credentials se crea una nueva credencial de tipo nombre de usuario y contraseña.
Así, para crear una imagen a partir de la aplicación que se testea en esta otra entrada, en el pipeline, se añade una fase que se ejecuta en la misma máquina en la que esté instalado Jenkins (agent any
). Esta fase tiene tres etapas: crear la imagen, subirla a DockerHub y borrarla de la máquina local.
pipeline {
environment {
IMAGEN = "fjhuete/polls"
USUARIO = 'DockerHub'
}
agent none
stages {
...
stage('Creación de la imagen') {
agent any
stages {
stage('Build') {
steps {
script {
newApp = docker.build "$IMAGEN:$BUILD_NUMBER"
}
}
}
stage('Deploy') {
steps {
script {
docker.withRegistry( '', USUARIO ) {
newApp.push()
}
}
}
}
stage('Clean Up') {
steps {
sh "docker rmi $IMAGEN:$BUILD_NUMBER"
}
}
}
}
}
}
Junto al Jenkinsfile, en el repositorio se deben incluir también el resto de ficheros que permiten la construcción de la imagen como el Dockerfile, el script de inicio de la imagen Docker o el fichero docker-compose que permite desplegar la imagen junto a una base de datos.
- Dockerfile
- Script
- docker-compose
FROM python:3.12.1-bookworm
WORKDIR /usr/src/app
COPY * .
COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod +x /usr/local/bin/docker-entrypoint.sh \
&& pip install mysqlclient \
&& pip install --no-cache-dir --break-system-packages -r requirements.txt
EXPOSE 3000
ENV URL_BASE=http://localhost
ENV DJANGO_MAIL=mail@mail.org
ENV DJANGO_USER=admin
ENV DJANGO_PASS=admin
CMD /usr/local/bin/docker-entrypoint.sh
#!/bin/bash
export DJANGO_SUPERUSER_PASSWORD=$DJANGO_PASS
cd /usr/src/app
curl https://raw.githubusercontent.com/vishnubob/wait-for-it/refs/heads/master/wait-for-it.sh > wait-for-it.sh
chmod +x wait-for-it.sh
./wait-for-it.sh db:3306 --timeout=30 --strict
python3 manage.py migrate
python3 manage.py createsuperuser --username $DJANGO_USER --email $DJANGO_MAIL --noinput
python3 manage.py runserver 0.0.0.0:3000
services:
app:
container_name: publicaciones
image: fjhuete/polls
restart: always
environment:
URL_BASE: ${URL_BASE}
DB_HOST: ${DB_HOST}
DB_USER: ${DB_USER}
DB_PASS: ${DB_PASS}
DB: ${DB}
DJANGO_MAIL: ${DJANGO_MAIL}
DJANGO_USER: ${DJANGO_USER}
DJANGO_PASS: ${DJANGO_PASS}
ports:
- ${PUERTO}:3000
depends_on:
- db
db:
container_name: django_db
image: mariadb:${VERSION_MARIADB}
restart: always
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
volumes:
- django_data:/var/lib/mysql
volumes:
django_data:
Adicionalmente, se puede configurar el pipeline de Jenkins para que se envíe un correo electrónico cada vez que se ejecute la tarea con el resultado de la ejecución.
pipeline {
...
stages {
...
}
post {
always {
mail to: 'correo@javihuete.site',
subject: "Estado del pipeline: ${currentBuild.fullDisplayName}",
body: "El despliegue ${env.BUILD_URL} ha tenido como resultado: ${currentBuild.result}"
}
}
}