Пользователь Docker не может писать в смонтированную папку - PullRequest
3 голосов
/ 07 мая 2019

У меня есть следующие настройки:

  selenium-chrome:
    image: selenium/node-chrome-debug:3.141.59-neon
    container_name: chrome-e2e
    depends_on:
      - selenium-hub
    environment:
      - HUB_HOST=selenium-hub
      - HUB_PORT=4444
      - SHM-SIZE=2g
      - GRID_DEBUG=false
      - NODE_MAX_SESSION=1
      - NODE_MAX_INSTANCES=5
      - TZ=Europe/Brussels
    hostname: chrome-e2e
    networks:
      - build-network
    ports:
      - 5900:5900
    volumes:
      - ./target:/home/seluser/Downloads

Тесты Selenium выполняются внутри контейнера, фактический код теста находится вне контейнера.Используя Maven, мы управляем жизненным циклом контейнеров.Как видите, я установил папку загрузки Chrome (внутри контейнера) в папку target моего приложения.Все хорошо смонтировано, но когда Chrome пытается загрузить файл, разрешается запись в /home/seluser/Downloads.UID и GID /home/seluser/Downloads устанавливаются на 2100: 2100 Docker.Сам Chrome запускается через пользователя seluser.

Что мне нужно сделать, чтобы дать seluser разрешение на запись в папку, принадлежащую 2100?

Заранее спасибо.Привет

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Монтирование bind в Linux не выполняет никакого пространства имен для uid или gid, а монтирование хоста выполняет монтирование bind под крышками. Поэтому, если uid внутри контейнера отличается от uid на хосте, вы получите проблемы с разрешениями. Я работал над этим в других контейнерах с помощью скрипта fix-perms Реализация, которая выглядит как следующий Dockerfile:

FROM selenium/node-chrome-debug:3.141.59-neon
COPY --from=sudobmitch/base:scratch /usr/bin/gosu /usr/bin/fix-perms /usr/bin/
COPY entrypoint.sh /entrypoint.sh
# use a chmod here if you cannot fix permissions outside of docker
RUN chmod 755 /entrypoint.sh 
USER root
ENTRYPOINT [ "/entrypoint.sh" ]

entrypoint.sh выглядит так:

#!/bin/sh
if [ "$(id -u)" = "0" -a -d "/home/seluser/Downloads" ]; then
  fix-perms -r -u seluser /home/seluser/Downloads
  exec gosu seluser /opt/bin/entry_point.sh "$@"
else
  exec /opt/bin/entry_point.sh "$@"
fi

Здесь происходит то, что контейнер запускается с правами root, а скрипт fix-perms корректирует seluser внутри контейнера в соответствии с uid каталога /home/seluser/Downloads. exec gosu затем запускает ваш контейнерный процесс как привилегированный пользователь как новый pid 1.

Вы можете увидеть код, используемый для реализации этого по адресу: https://github.com/sudo-bmitch/docker-base

Я обсуждал этот метод в нескольких своих презентациях, в том числе: https://sudo -bmitch.github.io / Presentations / dc2019 / tips-and-tricks-of-the-captains.html # fix- завивка

0 голосов
/ 07 мая 2019

Вы можете создать свой собственный Dockerfile:

FROM selenium/node-chrome-debug:3.141.59-neon

VOLUME /home/seluser/Downloads

и docker-compose.yml должен быть:

  selenium-chrome:
    build: .
    container_name: chrome-e2e
    depends_on:
      - selenium-hub
  ...

Директива VOLUME создаст каталог с текущим пользователем (в данном случае с seluser), так что Docker не придется создавать его с другим пользователем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...