Tengo dockerfile
FROM centos:7
ENV foo=42
luego lo construyo
docker build -t my_docker .
y ejecutarlo.
docker run -it -d my_docker
¿Es posible pasar argumentos desde la línea de comando y usarlo con if else 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
docker
dockerfile
nick_gabpe
fuente
fuente

RUN if [ "$arg" == "42" ]; then ENV=TRUE; else ENV=FALSE; fi. O si es posible que falte arg:RUN if [ "x$arg" == "x42" ]; then ...Respuestas:
Puede que no se vea tan limpio, pero puede tener su Dockerfile (condicional) de la siguiente manera:
y luego construya la imagen como:
docker build -t my_docker . --build-arg arg=45o
docker build -t my_docker .fuente
[ "$arg" = "x" ]lugar de[ "x$arg" = "x" ]?if [ $arg != "" ] ;, pero estoy seguro de que hay algunos Gotcha no estoy familiarizado conif [[ -n "$arg" ]]Es verdadero si un parámetro no está vacío,if [[ -z "$arg" ]]verdadero si un parámetro está vacío[ "x$arg" = "x" ]parece que está comparando dos cadenas entre comillas, pero las comillas se eliminan; Esto mantiene la sintaxis correcta. Después de la cita de desmonte: Bueno:if x = x ... Malo:if =. SIN EMBARGO, HAY mejores formas de verificar la existencia de un parámetro: Verifique la existencia de argumentos de entrada .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)
Así que preferí crear un
bash scripten mi espacio de trabajo combinado con--build-argpara manejar la declaración if mientras Docker compila verificando si el argumento está vacío o noGuión bash:
Dockerfile:
Compilación de Docker:
Observación: esto irá al else (falso) en el script bash
Observación: esto irá al if (verdadero)
Edición 1:
Después de varios intentos he encontrado el siguiente artículo y esto uno que me ayudó a entender 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 else está funcionando un poco diferente en la compilación de la ventana acoplable. por ejemplo, solo necesita un "=" en lugar de "==" para comparar cadenas.
Entonces puedes hacer esto dentro del
Dockerfiley en el
docker build:fuente
Según el documento del
docker buildcomando , hay un parámetro llamado--build-arg.Uso de ejemplo:
En mi opinión, es lo que necesitas :)
fuente
Existe una alternativa interesante a las soluciones propuestas, que funciona con un solo Dockerfile , requiere solo una llamada a la compilación de la ventana acoplable por compilación condicional y evita bash .
Solución:
Lo siguiente
Dockerfileresuelve ese problema. Cópialo, pégalo y pruébalo tú mismo.Explicación de Dockerfile:
Primero obtenemos una
baseimagen (centos:7en su caso) y la colocamos en su propio escenario. Elbaseescenario debe contener las cosas que desea hacer antes de la afección. Después de eso, tenemos dos etapas más, que representan las ramas de nuestra condición:branch-version-1ybranch-version-2. Los construimos a ambos. Lafinaletapa que elige una de estas etapas, basándose enmy_arg. Dockerfile condicional. Ahí tienes.Salida cuando se ejecuta:
(Lo abrevié un poco ...)
my_arg==2my_var==1¡Gracias a Tõnis por esta increíble idea!
fuente
Simplemente use el binario de "prueba" directamente para hacer esto. También debe usar el comando noop ":" si no desea especificar una condición "else", para que la ventana acoplable no se detenga con un error de valor de retorno distinto de cero.
fuente
RUN [ -z "$YOURVAR" ] && ... || :, creoRUN test -z "$YOURVAR" || echo "var is set" && echo "var is not set"&&delante de||:test ! -z "$YOURVAR" && echo "var is set" || echo "var is not set"Exactamente como dijeron otros, el script de shell ayudaría.
Solo un caso adicional, en mi humilde opinión, vale la pena mencionarlo (para alguien más que se encuentre aquí, buscando un caso más fácil), que es el reemplazo del entorno .
fuente
La respuesta aceptada puede resolver la pregunta, pero si desea
ifcondiciones de varias líneas en el archivo docker, puede hacerlo colocando\al final de cada línea (similar a cómo lo haría en un script de shell) y terminando cada comando con;. Incluso puede definir algoset -euxcomo el primer comando.Ejemplo:
En tu caso:
Luego construye con:
fuente
Usando el script Bash y Alpine / Centos
Dockerfile
script.sh
Pasando arg:
docker build -t test --build-arg MYARG="this is a test" .Sin arg:
docker build -t test .fuente