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=45
o
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 script
en mi espacio de trabajo combinado con--build-arg
para 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
Dockerfile
y en el
docker build
:fuente
Según el documento del
docker build
comando , 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
Dockerfile
resuelve ese problema. Cópialo, pégalo y pruébalo tú mismo.Explicación de Dockerfile:
Primero obtenemos una
base
imagen (centos:7
en su caso) y la colocamos en su propio escenario. Elbase
escenario 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-1
ybranch-version-2
. Los construimos a ambos. Lafinal
etapa que elige una de estas etapas, basándose enmy_arg
. Dockerfile condicional. Ahí tienes.Salida cuando se ejecuta:
(Lo abrevié un poco ...)
my_arg==2
my_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
if
condiciones 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 -eux
como 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