tag library images imagenes dockers container docker dockerfile

library - download docker image



¿COPIA/AÑADIR condicional en Dockerfile? (6)

Solución alternativa

Tenía el requisito de copiar FOLDER al servidor basado en las variables ENV. Tomé la imagen del servidor vacía. creó la estructura de la carpeta de implementación requerida en la carpeta local. luego se agrega debajo de la línea a DockerFile, copie la carpeta al contenedor. En la última línea se agregó un punto de entrada para ejecutar init file.sh antes de que Docker inicie el servidor.

#below lines added to integrate testing framework RUN mkdir /mnt/conf_folder ADD install /mnt/conf_folder/install ADD install_test /mnt/conf_folder/install_test ADD custom-init.sh /usr/local/bin/custom-init.sh ENTRYPOINT ["/usr/local/bin/custom-init.sh"]

Luego, cree el archivo custom-init.sh en local con un script similar al siguiente

#!/bin/bash if [ "${BUILD_EVN}" = "TEST" ]; then cp -avr /mnt/conf_folder/install_test/* /mnt/wso2das-3.1.0/ else cp -avr /mnt/conf_folder/install/* /mnt/wso2das-3.1.0/ fi;

En el archivo docker-compose debajo de las líneas.

entorno: - BUILD_EVN = TEST

Estos cambios copian la carpeta al contenedor durante la construcción de la ventana acoplable. cuando ejecutamos docker-componer , copie o implemente la carpeta requerida real en el servidor antes de que se inicie el servidor.

Dentro de mis Dockerfiles me gustaría COPIAR un archivo en mi imagen si existe, el archivo require.txt para pip parece un buen candidato, pero ¿cómo se lograría esto?

COPY (requirements.txt if test -e requirements.txt; fi) /destination ... RUN if test -e requirements.txt; then pip install -r requirements.txt; fi

o

if test -e requirements.txt; then COPY requiements.txt /destination; fi RUN if test -e requirements.txt; then pip install -r requirements.txt; fi


¡Quizás no lo necesites! Veamos tu código nuevamente:

COPY (requirements.txt if test -e requirements.txt; fi) /destination RUN if test -e requirements.txt; then pip install -r requirements.txt; fi

Quizás puedas cambiar a:

COPY requirements.txt /requirements.txt RUN if test -e /requirements.txt; then pip install -r /requirements.txt; fi

Ahora tienes esto:

  • Si el archivo existe, será copiado por COPY y procesado por PIP dentro de RUN
  • Si el archivo no existe, COPY fallará (silenciosamente, supongo) y PIP no se EJECUTARÁ debido a la condición

Actualmente, esto no es compatible (ya que sospecho que conduciría a una imagen no reproducible, ya que el mismo Dockerfile copiaría o no el archivo, dependiendo de su existencia).

Esto aún se solicita, en el número 13045 , con comodines: " COPY foo/* bar/" not work if no file in foo "(mayo de 2015).
No se implementará por ahora (julio de 2015) en Docker, pero otra herramienta de compilación como bocker podría soportar esto.


Aquí hay una solución simple:

COPY foo file-which-may-exist* /target

Asegúrese de que exista foo , ya que COPY necesita al menos una fuente válida.

Si está presente el file-which-may-exist , también se copiará.

NOTA: Debe asegurarse de que su comodín no recoja otros archivos que no tiene la intención de copiar. Para tener más cuidado, ¿podría usar file-which-may-exist? en su lugar ( ? coincide con un solo carácter).

O incluso mejor, use una clase de caracteres como esta para asegurarse de que solo se pueda hacer coincidir un archivo:

COPY foo file-which-may-exis[t] /target


Como se indica en este comentario , la respuesta de Santhosh Hirekerur todavía copia el archivo, para archivar una copia condicional verdadera, puede usar este método.

ARG BUILD_ENV=copy FROM alpine as build_copy ONBUILD COPY file /file FROM alpine as build_no_copy ONBUILD RUN echo "I don''t copy" FROM build_${BUILD_ENV} # other stuff

Las instrucciones ONBUILD aseguran que el archivo solo se copie si BUILD_ENV selecciona la "rama". Establezca esta var usando un pequeño script antes de llamar a docker build


Copie todos los archivos en un directorio desechable, elija manualmente el que desea, descarte el resto.

COPY . /throwaway RUN cp /throwaway/requirements.txt . || echo ''requirements.txt does not exist'' RUN rm -rf /throwaway

Puede lograr algo similar utilizando etapas de compilación, que se basan en la misma solución, utilizando cp para copiar condicionalmente. Al usar una etapa de construcción, su imagen final no incluirá todo el contenido de la COPY inicial.

FROM alpine as copy_stage COPY . . RUN mkdir /dir_for_maybe_requirements_file RUN cp requirements.txt /dir_for_maybe_requirements_file &>- || true FROM alpine # Must copy a file which exists, so copy a directory with maybe one file COPY --from=copy_stage /dir_for_maybe_requirements_file / RUN cp /dir_for_maybe_requirements_file/* . &>- || true CMD sh