Compilación de Dockerfile: ¿es posible ignorar el error?

111

Tengo un Dockerfile. Al construir la imagen, la compilación falla en este error:

automake: error: no 'Makefile.am' found for any configure output
Error build: The command [/bin/sh -c aclocal && autoconf && automake -a] returned a non-zero code: 1

que en realidad es inofensivo. La biblioteca se compila bien, pero Docker detiene la compilación una vez que recibe este error. ¿Hay alguna forma de que pueda indicarle a Docker que simplemente ignore esto?

Oskar
fuente

Respuestas:

220

Por supuesto. Docker solo responde a los códigos de error devueltos por los RUNscripts de shell en Dockerfile. Si Dockerfiletiene algo como:

RUN make

Podrías reemplazar eso con:

RUN make; exit 0

Esto siempre devolverá un 0código de salida (correcto). La desventaja aquí es que su imagen aparecerá para construir con éxito, incluso si no son errores reales en el proceso de construcción.

larsks
fuente
2
Vine aquí cuando intentaba correr service php7-fpm start. Devolvería 1 y RUN fallaría; usar service php7-fpm start; service php7-fpm statushace el truco: parece resolver un problema durante la compilación también, ya que ambos comandos que se ejecutan por separado causarían problemas.
igorsantos07
Vine aquí cuando intentaba construir Qt5 desde la fuente. Se compilaría bien, pero al usar la compilación simultánea combinada con el hecho de que el proceso de compilación de Qt tiene pruebas de tiempo de compilación que se ejecutan desde make (que falla intencionalmente), mi comando RUN salió con el error (2). ¡Con suerte, esto resolverá el problema!
Lennart Rolland
33

Esto podría ser de interés para aquellos cuyos posibles errores en sus imágenes no son lo suficientemente inofensivos como para pasar desapercibidos / registrados . (Además, no hay suficiente representante para comentar, así que aquí como respuesta).

Como se señaló, la desventaja RUN make; exit 0es que no se llega a saber si su compilación falló. Por lo tanto, use algo como:

make test 2>&1 > /where/ever/make.log || echo "There were failing tests!"

De esta manera, se le notifica a través del registro del proceso de construcción de la imagen de la ventana acoplable, y puede ver qué fue exactamente lo que salió mal durante make(o cualquier otra ejecución, esto no está restringido).

meses
fuente
Esta es una respuesta muy subestimada. Mi caso de uso fue que algunas listas de paquetes no estaban accesibles y apt-get update -yestaban fallando.
Silviu Burcea
14

También puede usar el error estándar de ignorar bash || true, que es bueno si está en el medio de una cadena:

RUN <first stage> && <job that might fail> || true && <next stage>
MortenB
fuente
justo lo que necesitaba :) lo que sería aún mejor es fallar si el trabajo falla, pero después de la siguiente etapa (limpieza)
csomakk