Docker, monte os volumes como somente leitura

106

Estou trabalhando com Docker e quero montar uma pasta dinâmica que muda muito (para não ter que fazer uma imagem Docker para cada execução, o que seria muito caro), mas quero que essa pasta seja somente leitura . Mudar o proprietário da pasta para outra pessoa funciona. No entanto, chownrequer rootacesso, que eu preferiria não expor a um aplicativo.

Quando eu uso o -vsinalizador para montar, ele fornece qualquer nome de usuário que eu forneça, eu criei um usuário não root dentro da imagem do docker, no entanto, todos os arquivos no volume com o proprietário como o usuário que executou o docker, mudam para o usuário I dar a partir da linha de comando, então não posso criar arquivos e pastas somente leitura. Como posso evitar isso?

Eu também adicionei mustafa ALL=(docker) NOPASSWD: /usr/bin/docker, para que pudesse mudar para outro usuário via terminal, mas ainda assim, os arquivos têm permissões para o meu usuário.

Mustafa
fonte
Apenas pensei em deixar um comentário aqui dizendo que permitir que um usuário execute containers docker é o mesmo que dar a ele acesso root completo. Isso também está documentado na seção de segurança da documentação do docker.
Blackclaws

Respostas:

170

Você pode especificar que um volume deve ser somente leitura anexando :roà -vchave:

docker run -v volume-name:/path/in/container:ro my/image

Observe que a pasta é então somente leitura no contêiner e leitura e gravação no host.

Edição 2018

De acordo com a documentação Use volumes , agora existe outra maneira de montar volumes usando o --mountswitch. Aqui está como utilizar isso com somente leitura:

$ docker run --mount source=volume-name,destination=/path/in/container,readonly my/image

docker-compose

Aqui está um exemplo de como especificar contêineres somente leitura em docker-compose:

version: "3"
services:
  redis:
    image: redis:alpine
    read_only: true
Alpes
fonte
8
há permissão para gravações, mas não é possível gravá-las de volta no host? isso seria fantástico
Ray Foss
9
Parece que você não deseja especificar nenhum volume.
Alp de
1
Mais ou menos ... Eu simplesmente não gosto de ter que construir uma imagem apenas para usar o Dockerfile COPY ou usar um docker cpcomando separado em um contêiner de desligamento.
Ray Foss de
5
Talvez você possa criar uma nova pergunta para que forneça mais detalhes e vincule-a aqui?
Alp
Você também pode usar a sintaxe curta com docker compote, ou seja,redis:alpine:ro
mb14
23

docker-compose

Esta é uma maneira adequada de especificar o volume somente leitura em docker-compose:

version: "3.2" # Use version 3.2 or above
services:
  my_service:
    image: my:image
    volumes:
      - type: volume
        source: volume-name
        target: /path/in/container
        read_only: true
volumes:
  volume-name:

https://docs.docker.com/compose/compose-file/#long-syntax-3

Denis Stafichuk
fonte
2
Na verdade, é adequado, mas o que é somente leitura aqui é um volume, não um contêiner.
Константин Ван
Isso só funciona para mim com version: "3.2"- Obrigado :)
Davey
"Adicionado no formato de arquivo da versão 3.2." sim
rybo111
3
Você também pode fazer - './my-file.txt:/container-readonly-file.txt:ro'sob volumes- anote o :rono final.
rybo111