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