tag run remove hub example compose docker dockerfile

run - docker-compose



Dockerfile si más condición con argumentos externos (7)

Tengo dockerfile

FROM centos:7 ENV foo=42

entonces lo construyo

docker build -t my_docker .

y ejecutarlo

docker run -it -d my_docker

¿Es posible pasar argumentos desde la línea de comandos y usarlo con if if en Dockerfile? Me refiero a algo como

FROM centos:7 if (my_arg==42) {ENV=TRUE} else: {ENV=FALSE}

y construir con este argumento.

docker build -t my_docker . --my_arg=42



Exactamente como otros dijeron, el script de shell ayudaría.

Solo un caso adicional, en mi humilde opinión, vale la pena mencionar (para alguien más que tropieza aquí, buscando un caso más fácil), ese es el reemplazo del Medio Ambiente .

Las variables de entorno (declaradas con la declaración ENV ) también se pueden usar en ciertas instrucciones como variables para ser interpretadas por el Dockerfile .

La sintaxis ${variable_name} también admite algunos de los modificadores bash estándar como se especifica a continuación:

  • ${variable:-word} indica que si se establece la variable , el resultado será ese valor. Si no se establece la variable entonces la word será el resultado.

  • ${variable:+word} indica que si se establece la variable , entonces la word será el resultado; de lo contrario, el resultado es la cadena vacía.


Por alguna razón, la mayoría de las respuestas aquí no me ayudaron (tal vez está relacionado con mi imagen FROM en el Dockerfile)

Por lo tanto, preferí crear un bash script en mi espacio de trabajo combinado con --build-arg para manejar la declaración if mientras Docker construye comprobando si el argumento está vacío o no

Script Bash:

#!/bin/bash -x if test -z $1 ; then echo "The arg is empty" ....do something.... else echo "The arg is not empty: $1" ....do something else.... fi

Dockerfile:

FROM ... .... ARG arg COPY bash.sh /tmp/ RUN chmod u+x /tmp/bash.sh && /tmp/bash.sh $arg ....

Docker Build:

docker build --pull -f "Dockerfile" -t $SERVICE_NAME --build-arg arg="yes" .

Observación: Esto irá a lo contrario (falso) en el script bash

docker build --pull -f "Dockerfile" -t $SERVICE_NAME .

Observación: Esto irá al if (verdadero)

Editar 1:

Después de varios intentos, encontré el siguiente article y este que me ayudó a comprender 2 cosas:

1) ARG antes de FROM está fuera de la compilación

2) El shell predeterminado es / bin / sh, lo que significa que if if está funcionando un poco diferente en la construcción de Docker. por ejemplo, solo necesita un "=" en lugar de "==" para comparar cadenas.

Entonces puedes hacer esto dentro del Dockerfile

ARG argname=false #default argument when not provided in the --build-arg RUN if [ "$argname" = "false" ] ; then echo ''false''; else echo ''true''; fi

y en la docker build :

docker build --pull -f "Dockerfile" --label "service_name=${SERVICE_NAME}" -t $SERVICE_NAME --build-arg argname=true .


Puede que no se vea tan limpio, pero puede tener su Dockerfile (condicional) de la siguiente manera:

FROM centos:7 ARG arg RUN if [ "x$arg" = "x" ] ; then echo Argument not provided ; else echo Argument is $arg ; fi

y luego construye la imagen como:

docker build -t my_docker . --build-arg arg=45

o

docker build -t my_docker .


Si lo que desea es generar imágenes dinámicamente, entonces probablemente debería hacerlo con un script de compilación.

Docker ya proporciona SDK para muchos idiomas que generalmente incluyen una llamada de compilación que le permite proporcionar una cadena arbitraria o un Dockerfile para compilar.

Por ejemplo, con Ruby:

require ''docker'' val = my_arg == 42 ? "TRUE" : "FALSE" # Create an Image from a Dockerfile as a String. Docker::Image.build("FROM centos:7/nENV MY_ENV=" + val)


Simplemente use el binario "prueba" directamente para hacer esto. También debe usar el comando noop ":" si no desea especificar una condición "else", por lo que la ventana acoplable no se detiene con un error de valor de retorno distinto de cero.

RUN test -z "$YOURVAR" || echo "var is set" && echo "var is not set" RUN test -z "$YOURVAR" && echo "var is not set" || : RUN test -z "$YOURVAR" || echo "var is set" && :


Usando script Bash y Alpine / Centos

Dockerfile

FROM alpine #just change this to centos ARG MYARG="" ENV E_MYARG=$MYARG ADD . /tmp RUN chmod +x /tmp/script.sh && /tmp/script.sh

script.sh

#!/usr/bin/env sh if [ -z "$E_MYARG" ]; then echo "NO PARAM PASSED" else echo $E_MYARG fi

Pasar arg: docker build -t test --build-arg MYARG="this is a test" .

.... Step 5/5 : RUN chmod +x /tmp/script.sh && /tmp/script.sh ---> Running in 10b0e07e33fc this is a test Removing intermediate container 10b0e07e33fc ---> f6f085ffb284 Successfully built f6f085ffb284

Sin arg: docker build -t test .

.... Step 5/5 : RUN chmod +x /tmp/script.sh && /tmp/script.sh ---> Running in b89210b0cac0 NO PARAM PASSED Removing intermediate container b89210b0cac0 ....