docker -compose: создать именованный том как специфицированный c пользователь - PullRequest
0 голосов
/ 16 апреля 2020

Вот минимальный docker-compose.yml:

version: "3.6"

services:
  foo:
    user: "${UID}:${GID}"
    image: node:latest
    container_name: foo
    working_dir: /var/www/foo
    volumes:
      - bar:/var/www/foo/bar

volumes:
  bar:

После запуска docker-compose up именованный том создается в /var/lib/docker/volumes/project_bar, а каталог project_bar принадлежит root - это нормально , Хотя каталог _data внутри него также принадлежит root - я бы хотел, чтобы он принадлежал указанному c, не root пользователю.

Для пример:

docker-compose run --rm foo sh -c "mkdir bar/foo"

завершится с ошибкой mkdir: cannot create directory 'bar/foo': Permission denied.

У меня сложилось впечатление, что указание user: "${UID}:${GID}" (примечание: uid / gid доступно для docker , экспортированные в оболочку, они решат это. Очевидно, я был не прав.

Есть ли способ иметь /var/lib/docker/volumes/project_bar/_data принадлежащим конкретному c пользователю? Без chown ничего, если возможно. И без привлечения Dockerfile.

РЕДАКТИРОВАТЬ: Чтобы уточнить, я хотел бы /var/www/foo/bar в контейнере и его эквивалент в /var/lib/docker/volumes, чтобы принадлежать специфицированный c, не root пользователь.

1 Ответ

1 голос
/ 16 апреля 2020

Вы используете Dockerfile, или вам нужно настроить громкость с помощью отдельного процесса. Именованный том будет инициализирован с содержимым изображения, включая файлы, каталоги, владельцев и разрешения. Это происходит, когда том пустой или отсутствует.

Таким образом, ваши параметры включают в себя:

  • обновить изображение, чтобы включить желаемое владение этим каталогом. Обратите внимание, если изображение определяет это как том, ваше изменение должно предшествовать этому определению.
  • заранее создать том с желаемым владельцем и смонтировать его в контейнере
  • изменить точку входа контейнера чтобы запустить как root, исправьте права доступа, а затем переключитесь на нужного пользователя (используя что-то вроде gosu)

Развернув второй вариант, вы можете создать том с желаемым владение и контент, запустив временный контейнер для выполнения задачи:

docker container run --rm -v bar-data:/data busybox /bin/sh -c \
  "touch /data/.initialized && chown -R ${UID}:${GID} /data"

Затем в файле compose вы можете объявить этот том как внешний:

version: "3.6"

services:
  foo:
    user: "${UID}:${GID}"
    image: node:latest
    container_name: foo
    working_dir: /var/www/foo
    volumes:
      - bar:/var/www/foo/bar

volumes:
  bar:
    # tell compose this volume is externally created with a different name
    external: true
    name: bar-data

Это создаст том с один файл, необходимый для предотвращения повторной инициализации docker пустого тома из содержимого изображения. Это также означает, что вам нужно загрузить любые данные в том, так как он будет пустым. Обычный метод копирования данных в том включает использование tar:

tar -cC source_dir . | \
  docker run --rm -i -v foo-data:/target busybox tar -xC /target
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...