Suponha que eu tenha um contêiner do Docker e uma pasta no meu host /hostFolder
. Agora, se eu quiser adicionar esta pasta ao contêiner do Docker como um volume, posso fazer isso usando ADD
-o Dockerfile
ou montando-o como um volume.
Por enquanto, tudo bem.
Agora /hostFolder
contém uma subpasta /hostFolder/subFolder
,.
Desejo montar /hostFolder
no contêiner do Docker (seja como leitura-gravação ou somente leitura, não importa, funciona para mim), mas NÃO quero incluí-lo /hostFolder/subFolder
. Desejo excluir isso e também quero que o contêiner do Docker possa fazer alterações nessa subpasta, sem a conseqüência de alterá-lo também no host.
Isso é possível? Se sim, como?
docker
dockerfile
Golo Roden
fonte
fonte
Respostas:
Usando o docker-compose, posso usar node_modules localmente, mas ignorá-lo no contêiner do docker usando a seguinte sintaxe no
docker-compose.yml
Portanto, tudo
./angularApp
é mapeado para/opt/app
e, em seguida, crio outro volume de montagem/opt/app/node_modules/
que agora está no diretório vazio - mesmo que na minha máquina local./angularApp/node_modules
não esteja vazio.fonte
/opt/app/node_modules/
por outro diretório com o mesmo nome. Erro acontece: 'volume ocupado'-v $(pwd):/build/ -v /build/node_modules
If you start a container which creates a new volume, as above, and the container has files or directories in the directory to be mounted (such as /app/ above), the directory’s contents are copied into the volume.
Se você deseja que os subdiretórios sejam ignorados pelo docker-compose, mas persistentes, faça o seguinte em
docker-compose.yml
:Isso montará seu diretório atual como um volume compartilhado, mas montará um volume persistente de janela de encaixe no lugar do
node_modules
diretório local . Isso é semelhante à resposta do @kernix, mas permitiránode_modules
persistir entre asdocker-compose up
execuções, o que provavelmente é o comportamento desejado.fonte
docker-compose down
irá remover os recipientes, mas o volume irá persistir até que você executar algo parecidodocker system prune
node_modules:
volume nomeado "ignora" o/app/node_modules
contêiner do docker, poderá achar útil este post Como o docker lida com vários tipos de montagem?Para excluir um arquivo, use o seguinte
fonte
Cannot start service xxx: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"rootfs_linux.go:58: mounting \\\"/dev/null\\\" to rootfs \\\"/var/lib/docker/overlay2/d15ed56ad020d408c63a1f6a6365dbb88d5d3b78a4605980d3faa9861102ef21/merged\\\" at [...] unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
. Adicionar uma barra à direita não ajudou./dev/null
para o contêiner, como um arquivo de dispositivo.Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
. Isso não é exatamente o que o OP estava procurando, mas foi muito útil para mim, pois eu precisava excluir um único arquivo.Primeiro, usar a
ADD
instrução em um Dockerfile é muito diferente de usar um volume (pelo-v
argumentodocker run
ou pelaVOLUME
instrução em um Dockerfile). Os comandosADD
eCOPY
apenas tiram uma cópia dos arquivos no momento em quedocker build
são executados. Esses arquivos não são atualizados até que uma nova imagem seja criada com odocker build
comando Por outro lado, o uso de um volume significa essencialmente "esse diretório não deve ser armazenado na imagem do contêiner; em vez disso, use um diretório no host"; sempre que um arquivo dentro de um volume for alterado, o host e o contêiner o verão imediatamente.Não acredito que você possa alcançar o que deseja usando volumes; terá que repensar sua estrutura de diretórios se desejar fazer isso.
No entanto, é bastante simples conseguir usar
COPY
(o que deve ser preferidoADD
). Você pode usar um.dockerignore
arquivo para excluir o subdiretório ouCOPY
todos os arquivos e, em seguida, fazer umRUN rm bla
para remover o subdiretório.Lembre-se de que todos os arquivos adicionados à imagem com
COPY
ouADD
devem estar dentro do contexto de construção, ou seja, dentro ou abaixo do diretório em que você executadocker build
.fonte
.dockerignore
arquivo para excluir um subdiretório (ou mesmo um diretório). Dado que esse é o objetivo declarado do arquivo, é bastante estranho.squash
as camadas. Um é o github.com/goldmann/docker-squash e o outro é usadooc ex dockerbuild
no projeto openshift.Parece que a solução antiga não funciona mais (pelo menos para mim). Criar uma pasta vazia e mapear a pasta de destino para ela ajudou.
fonte
docker-compose 1.25.0-rc3
sintaxe de arquivo v3.Com a linha de comando do docker:
A
-v
opção também pode ser usada (crédito ao Bogdan Mart ), mas--mount
é mais clara e recomendada .fonte
para as pessoas que também tiveram o problema de a pasta node_modules ainda sobrescrever no sistema local e vice-versa
Esta é a solução, com
/
o seguimento dos node_modules sendo a correção.fonte
Para excluir um arquivo montado contido no volume da sua máquina, você precisará substituí-lo, alocando um volume para o mesmo arquivo. No seu arquivo de configuração:
Um exemplo no seu arquivo docker:
fonte