Docker, zamontuj woluminy jako tylko do odczytu

107

Pracuję z Dockerem i chcę zamontować dynamiczny folder, który bardzo się zmienia (więc nie musiałbym tworzyć obrazu Dockera dla każdego wykonania, co byłoby zbyt kosztowne), ale chcę, aby ten folder był tylko do odczytu . Zmiana właściciela folderu na kogoś innego działa. Jednak chownwymaga rootdostępu, których wolałbym nie narażać się do wniosku.

Kiedy używam -vflagi do montowania, daje to dowolną nazwę użytkownika, którą podam, utworzyłem użytkownika innego niż root w obrazie Dockera, jednak wszystkie pliki w wolumenie z właścicielem jako użytkownikiem, który uruchomił docker, zmieniają się w użytkownika I. dać z wiersza poleceń, więc nie mogę tworzyć plików i folderów tylko do odczytu. Jak mogę temu zapobiec?

Dodałem również mustafa ALL=(docker) NOPASSWD: /usr/bin/docker, więc mogłem zmienić użytkownika na innego przez terminal, ale nadal pliki mają uprawnienia dla mojego użytkownika.

Mustafa
źródło
Pomyślałem, że zostawię tutaj komentarz mówiący, że umożliwienie użytkownikowi uruchamiania kontenerów docker to to samo, co udzielenie mu pełnego dostępu do roota. Jest to również udokumentowane w sekcji dotyczącej bezpieczeństwa w dokumentacji Dockera.
Blackclaws

Odpowiedzi:

171

Możesz określić, że wolumin ma być tylko :rodo odczytu, dołączając do -vprzełącznika:

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

Zauważ, że folder jest wtedy tylko do odczytu w kontenerze i do odczytu i zapisu na hoście.

Edytuj 2018

Zgodnie z dokumentacją Użyj woluminów , istnieje teraz inny sposób montowania woluminów przy użyciu --mountprzełącznika. Oto jak to wykorzystać w trybie tylko do odczytu:

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

docker-compose

Oto przykład określania kontenerów tylko do odczytu w docker-compose:

version: "3"
services:
  redis:
    image: redis:alpine
    read_only: true
Turnia
źródło
8
czy są dozwolone zapisy, ale nie zapisują ich z powrotem do hosta? byłoby fantastycznie
Ray Foss
9
To brzmi tak, jakbyś w ogóle nie chciał określać głośności.
Alp
1
W pewnym sensie ... Po prostu nie lubię budować obrazu tylko po to, aby skorzystać z Dockerfile COPY lub użyć oddzielnego docker cppolecenia na zamkniętym kontenerze.
Ray Foss
5
Może mógłbyś stworzyć nowe pytanie, w którym podasz więcej szczegółów i połączysz je tutaj?
Alp
Możesz także użyć krótkiej składni z docker compote, tj.redis:alpine:ro
mb14
23

docker-compose

Oto właściwy sposób określenia woluminu tylko do odczytu w 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
źródło
2
Rzeczywiście jest to poprawne, ale to, co jest tutaj tylko do odczytu, to objętość, a nie pojemnik.
Константин Ван
To działa tylko dla mnie z version: "3.2"- Dzięki :)
Davey
„Dodano w formacie pliku w wersji 3.2”. tak
rybo111
3
Możesz też zrobić - './my-file.txt:/container-readonly-file.txt:ro'poniżej volumes- zanotuj :rona końcu.
rybo111