it-swarm.dev

Docker: montagens negadas. Os caminhos ... não são compartilhados no OS X e não são conhecidos pelo Docker

O comando docker run -v /var/folders/zz/... produz o seguinte erro.

docker: Error response from daemon: Mounts denied: 
The paths /var/folders/zz/... and /var/folders/zz/...
are not shared from OS X and are not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.

Quando eu abro o Compartilhamento de Arquivos, vejo que/private já está listado.

Se eu tentar adicionar /var/folder/, ele será resolvido para /private/var/folders, que é um subconjunto de/private e, portanto, a adição será rejeitada.

Para resumir, parece-me que o diretório /var/folders/.. é compartilhado pelo OS X como um subdiretório de /private e, portanto, deve ser conhecido pelo Docker. Qualquer ajuda sobre como resolver isso seria apreciada.

Como experiência, substituí o /private em File Sharing por /private/var/folders e reiniciei a janela de encaixe, mas o resultado não mudou.

Apenas para uma referência mais completa, este é o script sh , que executa este python script , que por sua vez executa o comando docker.

58
Aayush

Docker para Mac montagens de volume se comportam de maneira diferente do que o sistema Docker base. Isso ocorre principalmente porque o Docker tenta cumprir as diretrizes do sandbox do sistema de arquivos da Apple.

Conforme mostrado nas preferências do Docker, apenas determinados caminhos são exportados pelo macOS.

  • /Users
  • /Volumes
  • /tmp
  • /private

File Sharing preference panel

/var no macOS é um link simbólico para /private. Isso também é verdade para /tmp:

$ ls -ld /tmp /var
[email protected] 1 root  wheel  11 Jan 26 16:18 /tmp -> private/tmp
[email protected] 1 root  wheel  11 Jan 26 16:18 /var -> private/var

Por que /tmp está listado no painel de compartilhamento, mas /var não é (mesmo que ambos sejam parte de /private)? Docker for Mac's documentação sobre namespaces do sistema de arquivos explica:

Por padrão, você pode compartilhar arquivos em /Users/, /Volumes/, /private/ e /tmp diretamente. Para adicionar ou remover árvores de diretório que são exportadas para o Docker, use a guia Compartilhamento de arquivos no menu de baleias de preferências do Docker -> Preferências -> Compartilhamento de arquivos. (Veja Preferências.)

Todos os outros caminhos usados ​​nas montagens de ligação -v são originados do Moby Linux VM executando os contêineres do Docker, para que argumentos como -v /var/run/docker.sock:/var/run/docker.sock trabalhe como esperado. Se um caminho do macOS não for compartilhado e não existir na VM, uma tentativa de vincular a montagem falhará em vez de criá-lo na VM. Os caminhos que já existem no VM e contêm arquivos são reservados pelo Docker e não podem ser exportados do macOS.

Observe que /var/run é especificamente mencionado aqui como um local que seria montado a partir da VM do Linux, em vez do macOS.

Quando você solicita uma montagem de volume, as exportações do sistema de arquivos macOS são verificadas primeiro. Se não houver correspondência, o Linux VM onde o Docker está sendo executado é verificado em seguida. Se nenhum deles tiver o caminho solicitado, a montagem falhará.

No seu caso, /var não é exportado pelo macOS. /var existe na VM do Linux, mas /var/folders não. Portanto, o caminho não está disponível e a montagem falha.

Se você alterar o caminho para /private/var, ele será bem-sucedido, porque o macOS exporta toda a árvore do sistema de arquivos /private para montagem.

Para tornar as coisas mais portáteis, você pode querer testar em qual plataforma você está atualmente rodando, e se for macOS, prefixar o caminho de montagem com /private.

72
Dan Lowe

Como exemplo, usando o Portainer, esse comando funciona para mim:

docker run -d --restart unless-stopped -p 9000:9000 \
 -v /var/run/docker.sock:/var/run/docker.sock \
 -v /var:/data portainer/portainer --no-auth

Mas, se eu variar o -v /var:/data, não vai funcionar. Eu acho (mas não tenho certeza) que é porque o Docker está tentando fazer um mkdir. Então, se eu tentar montar -v /var/whatever:/data, o mkdir falhará porque não tem permissão suficiente e não funciona.

Eu tenho 2 Mac's (High Sierra) e eu tentei em ambos. Mesmo problema. Além disso, tentei usar o canal Beta do Docker. Acho que entendo a resposta de Dan Lowe: atualizarei esta resposta se isso funcionar para mim.

2
djangofan