Dentro dos meus Dockerfiles, gostaria de COPIAR um arquivo na minha imagem, se ele existir. O arquivo requirements.txt do pip parece um bom candidato, mas como isso seria feito?
COPY (requirements.txt if test -e requirements.txt; fi) /destination
...
RUN if test -e requirements.txt; then pip install -r requirements.txt; fi
ou
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
fonte
fonte
Respostas:
Isso não é suportado atualmente (como eu suspeito que levaria a uma imagem não reproduzível, já que o mesmo Dockerfile copiaria ou não o arquivo, dependendo de sua existência).
Isso ainda é solicitado, na edição 13045 , usando curingas: "
COPY foo/* bar/" not work if no file in foo
" (maio de 2015).Não será implementado por agora (julho de 2015) no Docker, mas outra ferramenta de compilação como o bocker pode suportar isso.
fonte
dev
ambiente front-end for executado com um servidor de desenvolvimento webpack e oprod
ambiente equivalente funcionar com uma/dist
pasta estática? Este é o caso na maioria das configurações de front-end hoje e, obviamente,dev
eprod
não pode ser o mesmo aqui. Então, como lidar com isso?Aqui está uma solução alternativa simples:
Certifique-se de que
foo
existe, poisCOPY
precisa de pelo menos uma fonte válida.Se
file-which-may-exist
estiver presente, também será copiado.NOTA: Você deve tomar cuidado para garantir que o seu caractere curinga não selecione outros arquivos que você não pretende copiar. Para ser mais cuidadoso, você pode usar
file-which-may-exist?
(?
corresponde a apenas um único caractere).Ou melhor ainda, use uma classe de caractere como esta para garantir que apenas um arquivo possa ser correspondido:
fonte
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
(onde a biblioteca compartilhada é a entidade desconhecida.)Conforme declarado por este comentário , a resposta de Santhosh Hirekerur ainda copia o arquivo, para arquivar uma cópia condicional verdadeira, você pode usar este método.
As
ONBUILD
instruções garantem que o arquivo só seja copiado se o "ramo" for selecionado peloBUILD_ENV
. Defina esta var usando um pequeno script antes de chamardocker build
fonte
Solução alternativa
Tive a necessidade de copiar a FOLDER para o servidor com base nas variáveis ENV. Peguei a imagem do servidor vazia. criou a estrutura de pasta de implantação necessária na pasta local. em seguida, adicionado abaixo da linha para DockerFile copiar a pasta para o contêiner. Eu n última linha ponto de entrada adicional para executar file.sh inicialização antes janela de encaixe iniciar o servidor.
Em seguida, crie o arquivo custom-init.sh no local com um script semelhante a abaixo
No arquivo docker-compose abaixo das linhas.
ambiente: - BUILD_EVN = TEST
Essas alterações copiam a pasta para o contêiner durante a construção do docker. quando executamos docker-compose up , copie ou implante a pasta real necessária para o servidor antes de iniciar o servidor.
fonte
Copie todos os arquivos para um diretório descartável, escolha manualmente o que deseja e descarte o resto.
Você pode conseguir algo semelhante usando estágios de construção, que contam com a mesma solução, usando
cp
para copiar condicionalmente. Usando um estágio de construção, sua imagem final não incluirá todo o conteúdo da inicialCOPY
.fonte
cache
e dependendo do cache eu escolho o que fazer nos arquivos de script!Tentei as outras ideias, mas nenhuma atendeu aos nossos requisitos. A ideia é criar uma imagem nginx básica para aplicativos da web estáticos filhos. Por motivos de segurança, otimização e padronização, a imagem base deve ser capaz de
RUN
comandos em diretórios adicionados por imagens filhas. A imagem base não controla quais diretórios são adicionados pelas imagens filhas. A suposição é que as imagens filhas terãoCOPY
recursos em algum lugar abaixoCOMMON_DEST_ROOT
.Essa abordagem é um hack, mas a ideia é que a imagem base oferecerá suporte a
COPY
instruções para diretórios 1 a N adicionados pela imagem filha.ARG PLACEHOLDER_FILE
eENV UNPROVIDED_DEST
são usados para satisfazer<src>
e<dest>
requisitos para qualquerCOPY
instrução não necessário.Esta solução tem deficiências óbvias, como o número fictício
PLACEHOLDER_FILE
e codificado de instruções COPY que são suportadas. Além disso, não há como se livrar das variáveis ENV que são usadas na instrução COPY.fonte