Como fazer uma pasta com links simbólicos aparecer como uma pasta normal

35

Eu tenho dois aplicativos Dart que eu preciso para dockerize. Esses dois aplicativos usam um diretório de origem compartilhado. Como o Docker evita a inclusão de arquivos de pastas fora do diretório de contexto ( project/app1 ) não posso adicionar arquivos de ../shared nem de shared (o link simbólico em projects/app1 ).

Estou procurando uma maneira de enganar o Docker para fazer isso de qualquer maneira.

Minha estrutura de projeto simplificada

- projects
  - app1
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - app2
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - shared
    - source

Eu poderia mover Dockerfile um nível para cima e executar docker build de lá, mas depois eu preciso de dois Dockerfiles (para app1 e app2) no mesmo diretório.

Minha idéia atual era, se eu pudesse esconder o fato de que projects/app1/shared é um symlink, esse problema seria resolvido. Eu verifiquei se eu posso compartilhar projects usando o Samba e remontá-lo em outro lugar e configurar o Samba para tratar links simbólicos como pastas normais, mas não descobri se isso é suportado (não tenho muita experiência com o Samba e ainda não tentei) um pouco).

Existe alguma outra ferramenta ou truque que permita isso?

Eu preferiria não alterar a estrutura do diretório porque isso causaria outros problemas e também não copiaria os arquivos.

    
por zoechi 20.11.2014 / 10:54

2 respostas

28

Eu não tenho muita experiência com docker , então não posso prometer que isso funcionará, mas uma opção seria montar o diretório em vez de vinculá-lo a ele:

$ cd projects/app1
$ mkdir shared
$ sudo mount -o bind ../shared shared/

Isso anexará ../shared a ./shared e deverá ser completamente transparente para o sistema. Conforme explicado em man mount :

The bind mounts.

Since Linux 2.4.0 it is possible to remount part of the file hierarchy somewhere else. The call is:

mount --bind olddir newdir

or by using this fstab entry:

/olddir /newdir none bind

After this call the same contents are accessible in two places.

    
por 20.11.2014 / 13:32
20

Esse problema surgiu repetidamente na comunidade do Docker. Isso basicamente viola a exigência de que um Dockerfile seja repetível se você executá-lo ou se eu o executar. Então, eu não esperaria essa habilidade, como descrito neste ticket: O comando Dockerfile ADD não segue links simbólicos no host # 1676 .

Então você tem que conceber uma abordagem diferente. Se você olhar para este problema: ADD para apoiar links simbólicos no argumento # 6094 , um amigo nosso da U & L ( @Patrick aka. Phemmer) fornece uma solução inteligente.

$ tar -czh . | docker build -

Isso diz a tar para desreferenciar os links simbólicos do diretório atual e, em seguida, enviar todos eles para o comando docker build - .

trecho da página de tar man
-c, --create
       create a new archive

-h, --dereference
       follow symlinks; archive and dump the files they point to

-z, --gzip, --gunzip --ungzip
    
por 20.11.2014 / 14:26