Em um arquivo Docker, eu tenho
COPY . .
Eu quero excluir um diretório inteiro, no meu caso, o diretório node_modules.
Algo assim:
COPY [all but **/node_modules/**] .
Isso é possível com o Docker?
Em um arquivo Docker, eu tenho
COPY . .
Eu quero excluir um diretório inteiro, no meu caso, o diretório node_modules.
Algo assim:
COPY [all but **/node_modules/**] .
Isso é possível com o Docker?
Respostas:
Crie um arquivo .dockerignore
no diretório de contexto de construção da janela de encaixe (portanto, nesse caso, provavelmente um diretório pai de node_modules) com uma linha:
**/node_modules
embora você provavelmente só queira:
node_modules
Informações sobre dockerignore: https://docs.docker.com/engine/reference/builder/#dockerignore-file
/config/nginx/ /config/logstash/
, não ls config/ gunicorn logs logstash nginx
ls /config/
, tentou adicionar esses caminhos ao seu .dockerignore sem o líder /
?
node_modules
não funciona em subdiretórios.
Para aqueles que não podem usar um arquivo .dockerignore (por exemplo, se você precisar do arquivo em uma CÓPIA, mas não em outra):
Sim, mas você precisa de várias instruções de CÓPIA. Especificamente, você precisa de uma CÓPIA para cada letra do nome do arquivo que deseja excluir.
COPY [^n]* # All files that don't start with 'n'
COPY n[^o]* # All files that start with 'n', but not 'no'
COPY no[^d]* # All files that start with 'no', but not 'nod'
Continue até ter o nome completo do arquivo ou apenas o prefixo que você tem certeza de que não terá outros arquivos.
COPY failed: no source files were specified
quando não houver arquivos começando com 'não', mas não 'aceno'.
src/
vá /var/www
e /conf/nginx.conf
vá para /etc/nginx/conf.d/default.conf
. Além disso, você pode copiar tudo e RUN rm -r conf
mais tarde (também mantenha a árvore de origem). Gostaria de saber se alguém tem outra sugestão.
COPY [^node_modules]*
para copiar todos os arquivos de nível superior.
No meu caso, meu Dockerfile continha uma etapa de instalação, que produzia o vendor
diretório (o equivalente em PHP node_modules
). Então, COPY
este diretório passa para a imagem final do aplicativo. Portanto, eu não poderia colocar vendor
no meu .dockerignore
. Minha solução foi simplesmente excluir o diretório antes de executar composer install
(o equivalente em PHP a npm install
).
FROM composer AS composer
WORKDIR /app
COPY . .
RUN rm -rf vendor \
&& composer install
FROM richarvey/nginx-php-fpm
WORKDIR /var/www/html
COPY --from=composer /app .
Essa solução funciona e não incha a imagem final, mas não é ideal, porque o vendor
diretório no host é copiado no contexto do Docker durante o processo de construção, o que aumenta o tempo.
composer.lock
antes composer install
. Sem o arquivo de bloqueio, um conjunto diferente de dependências (a pasta do fornecedor) pode ser instalado quando você criar na próxima vez.
Adicionar .dockerignore funciona para mim. Um ponto adicional Para aqueles que estão tentando esta solução no Windows , o Windows não permitirá que você crie um arquivo .dockerignore (pois, por padrão, não permite a criação de arquivos começando com.)
Para criar esse arquivo começando com. no Windows , inclua também um ponto final, como: .dockerignore.
e pressione enter (desde que você tenha ativado as opções de extensão de exibição nas opções de pasta)
Excluindo node_modules do diretório atual
node_modules
Excluindo node_modules em quaisquer subdiretórios imediatos
*/node_modules
Aqui estão os documentos oficiais
.dockerignore
?