如何在Shiny应用内写入Docker Volume?权限问题求解
问题解决:Shiny用户无法写入Docker挂载的Volume目录
项目目录结构
❯ tree ../write-to-volume-from-shiny ../write-to-volume-from-shiny ├── app.R ├── Dockerfile └── shiny-server.conf
Dockerfile内容
FROM rocker/shiny:4.3.1 RUN rm /srv/shiny-server/index.html /etc/shiny-server/shiny-server.conf COPY app.R /srv/shiny-server COPY shiny-server.conf /etc/shiny-server/ RUN chmod -R 755 /srv/shiny-server/ EXPOSE 80 CMD ["/usr/bin/shiny-server"]
app.R内容
library(shiny) ui <- fluidPage( actionButton("touch", "Touch file"), textOutput("out") ) server <- function(input, output, session) { observeEvent(input$touch, { if (fs::dir_exists("/data")) { fs::file_touch("/data/touch-test") # 此处报错,原因是shiny用户尝试写入root拥有的/data目录 } }) } shinyApp(ui, server)
shiny-server.conf内容
run_as shiny; server { listen 80; location / { site_dir /srv/shiny-server; log_dir /var/log/shiny-server; directory_index on; } }
操作步骤
配置Volume
docker volume create --name write-test
运行应用
docker buildx build . -t write docker run --mount source=write-test,target=/data -p 80:80 write
问题现象
访问http://127.0.0.1:80点击按钮后报错,核心原因是shiny用户无权限写入root用户拥有的/data目录。
解决方法
方法一:构建镜像时预先设置目录权限(推荐)
修改Dockerfile,添加创建/data目录并将归属设置为shiny用户的步骤,从根源解决权限问题:
FROM rocker/shiny:4.3.1 RUN rm /srv/shiny-server/index.html /etc/shiny-server/shiny-server.conf # 新增:创建/data目录并设置归属为shiny用户 RUN mkdir -p /data && chown shiny:shiny /data COPY app.R /srv/shiny-server COPY shiny-server.conf /etc/shiny-server/ RUN chmod -R 755 /srv/shiny-server/ EXPOSE 80 CMD ["/usr/bin/shiny-server"]
重新构建镜像并运行:
docker buildx build . -t write docker run --mount source=write-test,target=/data -p 80:80 write
方法二:启动容器时临时调整权限(适用于快速测试)
如果不想修改Dockerfile,可在启动容器时先执行权限修改命令,再启动Shiny服务:
docker run --mount source=write-test,target=/data -p 80:80 write sh -c "chown shiny:shiny /data && /usr/bin/shiny-server"
内容的提问来源于stack exchange,提问作者pietrodito
相关产品推荐
相关产品推荐

