Sobes.tech
Middle+

¿Cómo se puede pasar un atributo dinámico de CI a Docker durante la construcción de la imagen, por ejemplo, el identificador del proyecto, si no se utilizan variables de entorno?

sobes.tech AI

Respuesta de la IA

Se pueden usar argumentos de construcción.

# Sintaxis para definir un argumento de construcción con un valor predeterminado
ARG PROJECT_ID=default
# Uso del argumento en la instrucción COPY, por ejemplo
COPY ./app_${PROJECT_ID}.jar /app/app.jar
# O en la instrucción RUN
RUN echo "El ID del proyecto es ${PROJECT_ID}"

En el pipeline de CI/CD, al construir la imagen, se puede pasar el valor del argumento usando la bandera --build-arg:

# Ejemplo de comando de construcción en CI
docker build --build-arg PROJECT_ID=$CI_PROJECT_ID -t my-image:${CI_COMMIT_SHORT_SHA} .

Aquí, $CI_PROJECT_ID es una variable de CI que contiene el identificador del proyecto.

Otra forma es usar un archivo con variables para la construcción, aunque esto es más una variación del uso de variables de entorno:

# El Dockerfile no cambia
ARG PROJECT_ID=default
COPY ./app_${PROJECT_ID}.jar /app/app.jar

Archivo build-args.env:

PROJECT_ID=my-specific-project

Comando de construcción con archivo:

docker build --build-arg PROJECT_ID=$(cat build-args.env) -t my-image:${CI_COMMIT_SHORT_SHA} .

Otra opción es generar un archivo dentro del Dockerfile usando RUN:

ARG PROJECT_ID=default
# Generar un archivo con el identificador del proyecto
RUN echo "${PROJECT_ID}" > /app/project_id.txt
# Uso posterior de este archivo por la aplicación