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
De acuerdo con la
documentation
comando de
build
, hay un parámetro llamado
--build-arg
https://docs.docker.com/engine/reference/commandline/build/#set-build-time-variables-build-arg
Ejemplo de uso
docker build --build-arg HTTP_PROXY=http://10.20.30.2:1234 .
OMI es lo que necesitas :)
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 elDockerfile
.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 lavariable
, el resultado será ese valor. Si no se establece lavariable
entonces laword
será el resultado.
${variable:+word}
indica que si se establece lavariable
, entonces laword
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
....