Не можете получить доступ к файлу, созданному контейнером Docker, из другого контейнера? - PullRequest
0 голосов
/ 19 сентября 2019

Для текущего рабочего сценария у меня есть два контейнера, которые должны обмениваться данными.Первый контейнер - это приложение-колба, которое выполняет некоторую работу с данными и создает файл журнала.В то время как другой контейнер - R блестящее приложение, которое служит информационной панелью статуса для приложения, а также, когда это необходимо, пользователь также может напрямую просматривать файл журнала, предоставив ключ на самой приборной панели.Здесь моя проблема заключается в том, что при доступе к файлу журнала из блестящей панели мониторинга контейнера отказано в выдаче разрешения.Я смонтировал один и тот же том в обоих контейнерах, также попытался дать владельцу разрешение на блестящий контейнер приложения, но контейнер все еще не мог получить доступ к файлу, в то время как я могу получить доступ к одному и тому же файлу в расположении хоста.Есть ли что-то, чего мне не хватает, что требует авторизации общих томов между контейнерами, или есть какие-то проблемы с блестящим приложением.Пожалуйста, предоставьте возможные решения.

Необходимые файлы

Файлы Docker-compose.Docker-compose файл для приложения:

version: '3.7'
services:
  app:
    container_name: app
    image: mlengine
    networks:
      - network1
    build:
      context: .
      dockerfile: DockerfileEngine
    volumes:
      - ./logs_n_status:/root/project/logs_n_status
      #- logData:/root/project/logs_n_status
    ports:
      - 7011:3000
    expose:
      - "3000"

Docker-compose файл для блестящей панели инструментов:

# docker-compose.yml
version: '3.7'
services:
  dashboard:
    container_name: dashboard
    image: mlapidashboard
    networks:
      - network1
    build:
      context: .
      dockerfile: DockerfileRTD
    volumes:
      - /home/mlprod/dmda/testAPI/logs_n_status:/root/project/logs_n_status
      #--volumes-from Container4:ro
      #- logData:/root/project/logs_n_status:ro
    ports:
      - 9000:3838
networks:
    network1:
#volumes:
#    logData:

DockerfileEngine:

FROM ubuntu:18.04
RUN apt-get --fix-missing update && apt-get --fix-broken install && apt-get install -y poppler-utils && apt-get install -y tesseract-ocr && \
    apt-get install -y libtesseract-dev && apt-get install -y libleptonica-dev && ldconfig && apt-get install -y python3.6 && \
    apt-get install -y python3-pip && apt install -y libsm6 libxext6

RUN apt-get update && \
    apt-get install -y openjdk-8-jdk && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* && \
    rm -rf /var/cache/oracle-jdk8-installer;

ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
RUN export JAVA_HOME

WORKDIR /root/
RUN mkdir /root/project
WORKDIR /root/project
RUN mkdir /root/project/processingDirectory

ADD requirements.txt .
RUN pip3 install -r ./requirements.txt

COPY ./xxxx xxxx

RUN python3 ./nltkDownloader.py
CMD ["gunicorn", "-t", "999999", "--bind", "0.0.0.0:3000", "wsgi:app"]

DockerfileDashboard:

FROM rocker/shiny:3.5.1

RUN apt-get update && apt-get install libcurl4-openssl-dev libv8-3.14-dev libsasl2-dev libssl-dev -y &&\
  mkdir -p /var/lib/shiny-server/bookmarks/shiny

RUN R -e "install.packages(c('mongolite', 'dplyr', 'jsonlite', 'ggplot2', 'grid', 'gridExtra', 'DT', 'data.table', 'httr', 'shiny'))"

RUN mkdir /root/project
RUN mkdir /root/project/logs_n_status

COPY ./RealTimeDashboard /srv/shiny-server/RealTimeDashboard

RUN chmod -R 755 /srv/shiny-server/
RUN chmod -R 777 /root/project/logs_n_status

EXPOSE 3838

CMD ["/usr/bin/shiny-server.sh"]

1 Ответ

1 голос
/ 20 сентября 2019

Проблема в том, что rocker/shiny использует shiny в качестве пользователя ( src ), в то время как другое приложение создает журналы, используя root (и им могут быть установлены специальные привилегии).

Блестящий пользователь имеет UID = 999. Как извлечь его:

$ docker run -it --rm rocker/shiny bash
root@536f2edc5768:/usr/bin# su - shiny
$ id
uid=999(shiny) gid=999(shiny) groups=999(shiny)

Чтобы исправить ваши проблемы, я бы изменил DockerfileEngine, чтобы он выглядел так:

FROM ubuntu:18.04
RUN apt-get --fix-missing update && apt-get --fix-broken install && apt-get install -y poppler-utils && apt-get install -y tesseract-ocr && \
    apt-get install -y libtesseract-dev && apt-get install -y libleptonica-dev && ldconfig && apt-get install -y python3.6 && \
    apt-get install -y python3-pip && apt install -y libsm6 libxext6

RUN apt-get update && \
    apt-get install -y openjdk-8-jdk && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* && \
    rm -rf /var/cache/oracle-jdk8-installer;

RUN useradd -ms /bin/bash -u 999 theuser
RUN mkdir -p /project \
    && chown -R theuser /project

USER theuser
WORKDIR /project

ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
RUN export JAVA_HOME

RUN mkdir /project/processingDirectory

ADD requirements.txt .
RUN pip3 install -r ./requirements.txt

COPY --chown=theuser ./xxxx xxxx

RUN python3 ./nltkDownloader.py
CMD ["gunicorn", "-t", "999999", "--bind", "0.0.0.0:3000", "wsgi:app"]

Убедитесь, что подключенная папка доступна для записи обоим контейнером.

...