gpt4 book ai didi

r - 无法从另一个容器访问由 docker 容器创建的文件?

转载 作者:行者123 更新时间:2023-12-02 19:23:37 25 4
gpt4 key购买 nike

对于当前的工作场景,我有两个需要共享数据的容器。第一个容器是一个 flask 应用程序,它对数据进行一些处理并创建日志文件。而另一个容器是 R shiny 应用程序,它用作应用程序的状态仪表板,并且在需要时,用户还可以通过在仪表板上提供 key 来直接查看日志文件。我的问题是,从 Shiny 的仪表板容器访问日志文件时,权限被拒绝错误被抛出。我在两个容器上都安装了相同的卷,还尝试向 Shiny 的应用程序容器授予所有者权限,但容器仍然无法访问该文件,而我可以访问主机位置上的同一个文件。我是否缺少需要在容器之间授权共享卷的东西,或者 Shiny 的应用程序有任何问题。请提供可能的解决方案。

所需文件

Docker 组合文件。
应用程序的 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"

用于 Shiny 仪表板的 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"]

Dockerfile仪表板:
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"]

最佳答案

问题是 rocker/shiny使用 shiny作为用户 ( src ) 而其他应用程序使用 root 生成日志(并且他们可能设置了特殊权限)。

Shiny 用户的 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"]

确保挂载的文件夹对两个容器都是可写的。

关于r - 无法从另一个容器访问由 docker 容器创建的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58014116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com