Docker segue link simbólico fora do contexto

88

Mais uma pergunta sobre o link simbólico do Docker. Tenho vários arquivos que desejo copiar para todas as minhas compilações do Docker. Minha estrutura de dir é:

parent_dir
    - common_files
        - file.txt
    - dir1
        - Dockerfile  
        - symlink -> ../common_files

No exemplo acima, quero que o arquivo.txt seja copiado quando encaixar a compilação dentro do dir1. Mas não quero manter várias cópias de file.txt. Por este link, a partir da versão 0.10 do docker, a compilação do docker deve

Siga os links simbólicos dentro da raiz do contêiner para obter instruções de construção ADD.

Mas não recebo esse arquivo ou diretório quando construo com qualquer uma destas linhas no meu Dockerfile:

ADD symlink /path/dirname ou ADD symlink/file.txt /path/file.txt

a opção de montagem NÃO vai resolver para mim (plataforma cruzada ...). Tentei tar -czh . | docker build -tsem sucesso.

Existe uma maneira de fazer o Docker seguir o link simbólico e copiar common_files / file.txt para o contêiner integrado?

Ravi
fonte

Respostas:

68

Isso não é possível e não será implementado. Por favor, dê uma olhada na discussão sobre o problema do github nº 1676 :

Não permitimos isso porque não é repetível. Um link simbólico em sua máquina não é o mesmo que minha máquina e o mesmo Dockerfile produziria dois resultados diferentes. Além disso, ter links simbólicos para / etc / paasswd causaria problemas porque ligaria os arquivos do host e não seus arquivos locais.

0x7d7b
fonte
Obrigado. Sim, eu percebi esse link antes, mas pensei que fosse para uma versão muito mais antiga do docker (0.6.1). O log de alterações de 0,10 tipo de menção que isso é possível github.com/docker/docker/blob/master/…
Ravi
Além disso, se "parent_dir" for verificado em qualquer computador e se o link simbólico tiver um caminho relativo para "common_files", ele será repetido.
Ravi
2
Sua citação Follow symlinks inside container's root for ADD build instructions.significa que dentro do contêiner os links simbólicos são seguidos. Não está no diretório de contexto de construção. No ADD file.txt /dir/file.txtdiretório dirpode haver um link simbólico. Os argumentos que citei na minha resposta ainda são válidos e os links simbólicos ainda não são seguidos na versão mais recente. Você pode ter problemas (em relação à repetibilidade) ao armazenar links simbólicos em sistemas de controle de revisão como o git . Portanto, consulte esta questão .
0x7d7b
1
Eu vejo seu ponto em relação aos links simbólicos no git. Mas os links simbólicos não precisam entrar no git. Um script de configuração simples pode preparar o env local criando links simbólicos. Para mim, o custo de manter 'n' cópias de um arquivo compartilhado parece muito alto do ponto de vista da manutenção. Talvez eu tenha que servir por causa do apache. Obrigado.
Ravi de
18
que pena, enquanto vejo o ponto, não sigo a lógica e ela me morde. Git lida com symblinks perfeitamente, e eu também espero que as compilações funcionem em todas as máquinas e ambientes onde o repositório de origem é verificado ..?!
Gregor
9

Uma possibilidade é executar a compilação no diretório pai, com:

$ docker build [tags...] -f dir1/Dockerfile .

(Ou, de forma equivalente, no diretório filho)

$ docker build  [tags...] -f Dockerfile ..

O Dockerfile terá que ser configurado para copiar / adicionar com os caminhos apropriados. Dependendo de sua configuração, você pode querer que um .dockerignoreno pai deixe de fora coisas que você não deseja que sejam colocadas no contexto.

Shaunc
fonte
4

Se alguém ainda tiver esse problema, encontrei uma solução muito boa em superuser.com:

/superuser/842642/how-to-make-a-symlinked-folder-appear-as-a-normal-folder

Basicamente, sugere o uso de tar para remover a referência dos links simbólicos e alimentar o resultado na compilação do docker:

$ tar -czh . | docker build -
jdabrowski
fonte
Como fazer funcionar com docker-compose?
vitalets
2

em vez de usar simlinks, é possível resolver o problema administrativamente apenas movendo os arquivos de sites_available para sites_enabled em vez de copiar ou fazer simlinks

então a configuração do seu site estará em uma cópia apenas na pasta site_available se parou ou algo assim ou em sites_enabled se deve ser usado

Ilya Kolesnikov
fonte
1

Eu sei que isso quebra a portabilidade do docker build, mas você pode usar links físicos em vez de simbólicos:

ln /some/file ./hardlink
Eugene
fonte
3
Para ficar claro, isso funciona para arquivos, não diretórios.
GDorn