Docker, monte volúmenes como de solo lectura

106

Estoy trabajando con Docker y quiero montar una carpeta dinámica que cambia mucho (para no tener que hacer una imagen de Docker para cada ejecución, lo que sería demasiado costoso), pero quiero que esa carpeta sea de solo lectura. . Cambiar el propietario de la carpeta a otra persona funciona. Sin embargo, chownrequiere rootacceso, que preferiría no exponer a una aplicación.

Cuando uso la -vbandera para montar, da el nombre de usuario que le dé, creé un usuario no root dentro de la imagen de la ventana acoplable, sin embargo, todos los archivos en el volumen con el propietario como el usuario que ejecutó la ventana acoplable, cambia al usuario I dar desde la línea de comando, por lo que no puedo crear archivos y carpetas de solo lectura. ¿Cómo puedo prevenir esto?

También agregué mustafa ALL=(docker) NOPASSWD: /usr/bin/docker, para poder cambiar a otro usuario a través de la terminal, pero aún así, los archivos tienen permisos para mi usuario.

Mustafa
fuente
Solo pensé en dejar un comentario aquí diciendo que permitir que un usuario ejecute contenedores docker es lo mismo que darle acceso completo a la raíz. Esto también está documentado en la sección de seguridad de la documentación de Docker.
Blackclaws

Respuestas:

170

Puede especificar que un volumen debe ser de solo lectura agregando :roal -vconmutador:

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

Tenga en cuenta que la carpeta es de solo lectura en el contenedor y de lectura y escritura en el host.

2018 Editar

Según la documentación de uso de volúmenes , ahora hay otra forma de montar volúmenes mediante el --mountconmutador. A continuación, se explica cómo utilizar eso con solo lectura:

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

docker-compose

A continuación, se muestra un ejemplo de cómo especificar contenedores de solo lectura en docker-compose:

version: "3"
services:
  redis:
    image: redis:alpine
    read_only: true
Montaña
fuente
8
¿Se permiten escrituras, pero no se pueden escribir de nuevo en el host? Eso sería fantástico
Ray Foss
9
Suena como si no quisiera especificar ningún volumen en absoluto.
Alp
1
Más o menos ... simplemente no me gusta tener que construir una imagen solo para hacer uso de Dockerfile COPY o usar un docker cpcomando separado en un contenedor cerrado.
Ray Foss
5
¿Quizás podría crear una nueva pregunta para eso donde proporcione más detalles y la vincule aquí?
Alp
También puede usar la sintaxis corta con la compota de redis:alpine:ro
Docker
23

docker-compose

Aquí hay una forma adecuada de especificar el volumen de solo lectura en 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
fuente
2
De hecho, es correcto, pero lo que es de solo lectura aquí es un volumen, no un contenedor.
Константин Ван
Esto solo funciona para mí con version: "3.2"- Gracias :)
Davey
"Agregado en formato de archivo de la versión 3.2". sí
rybo111
3
También puede hacerlo por - './my-file.txt:/container-readonly-file.txt:ro'debajo volumes- tenga :roen cuenta el al final.
rybo111