Dentro de mis Dockerfiles, me gustaría COPIAR un archivo en mi imagen si existe, el archivo requirements.txt para pip parece un buen candidato, pero ¿cómo se lograría?
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
docker
dockerfile
derrend
fuente
fuente
Respuestas:
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 todavía se solicita, en el número 13045 , utilizando 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 admitir esto.
fuente
dev
entorno de front-end se ejecuta con un servidor de desarrollo webpack y elprod
entorno equivalente funciona con una/dist
carpeta estática? Este es el caso en la actualidad la mayoría de front-end configuraciones, y, obviamente,dev
yprod
no puede ser lo mismo aquí. Entonces, ¿cómo lidiar con eso?Aquí hay una solución alternativa simple:
Asegúrese de que
foo
exista, ya queCOPY
necesita al menos una fuente válida.Si
file-which-may-exist
está presente, también se copiará.NOTA: Debe asegurarse de que su comodín no recoja otros archivos que no tenga la intención de copiar. Para tener más cuidado, puede usar
file-which-may-exist?
en su lugar (?
coincide con un solo carácter).O incluso mejor, use una clase de carácter como esta para asegurarse de que solo se pueda hacer coincidir un archivo:
fuente
COPY --from=docker /usr/bin/docker /usr/lib/libltdl.so* /tmp/docker/
RUN mv /tmp/docker/docker /usr/bin/docker
RUN mv /tmp/docker/libltdl.so.7 /usr/lib/libltdl.so.7 || true
(donde la biblioteca compartida es la entidad desconocida.)Como se indica en este comentario , la respuesta de Santhosh Hirekerur aún copia el archivo, para archivar una copia condicional verdadera, puede usar este método.
Las
ONBUILD
instrucciones aseguran que el archivo solo se copia si la "rama" es seleccionada por elBUILD_ENV
. Configura esta var usando un pequeño script antes de llamardocker build
fuente
Trabajar alrededor de la solución
Tenía el requisito de copiar FOLDER al servidor basado en ENV Variables. 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.
Luego cree el archivo custom-init.sh en local con un script como el siguiente
En el archivo docker-compose debajo de las líneas.
entorno: - BUILD_EVN = TEST
Estos cambios copian la carpeta al contenedor durante la compilación de Docker. cuando ejecutamos docker-compose , copie o implemente la carpeta requerida real en el servidor antes de que se inicie.
fuente
Copie todos los archivos en un directorio desechable, elija manualmente el que desee y descarte el resto.
Puede lograr algo similar usando etapas de compilación, que se basan en la misma solución, usando
cp
para copiar condicionalmente. Al usar una etapa de construcción, su imagen final no incluirá todo el contenido de la inicialCOPY
.fuente
cache
y, dependiendo de cuál sea el caché, elijo qué hacer en los archivos de script!Probé las otras ideas, pero ninguna cumplió con nuestro requisito. La idea es crear una imagen nginx base para aplicaciones web estáticas secundarias. Por razones de seguridad, optimización y estandarización, la imagen base debe poder
RUN
ejecutar comandos en directorios agregados por imágenes secundarias. La imagen base no controla qué directorios agregan las imágenes secundarias. La suposición es que las imágenes de los niños seránCOPY
recursos en algún lugar debajoCOMMON_DEST_ROOT
.Este enfoque es un truco, pero la idea es que la imagen base admitirá la
COPY
instrucción para 1 a N directorios agregados por la imagen secundaria.ARG PLACEHOLDER_FILE
yENV UNPROVIDED_DEST
se utilizan para satisfacer<src>
y<dest>
requisitos para cualquierCOPY
no necesitan instrucción.Esta solución tiene deficiencias obvias como el número ficticio
PLACEHOLDER_FILE
y codificado de instrucciones COPY que son compatibles. Además, no hay forma de deshacerse de las variables ENV que se utilizan en la instrucción COPY.fuente