文件准备

将Shiny用到的server.Rui.R一起放在app文件夹中

./app:
server.R ui.R

写个Dockerfile,把用到的包都写在 install.r 后面

FROM rocker/r-base:latest
LABEL maintainer="email <example@mail.com>"
RUN apt-get update && apt-get install -y --no-install-recommends \
    sudo \
    libcurl4-gnutls-dev \
    libcairo2-dev \
    libxt-dev \
    libssl-dev \
    libssh2-1-dev \
    && rm -rf /var/lib/apt/lists/*
RUN install.r shiny shinyBS dplyr stringr
RUN echo "local(options(shiny.port = 3838, shiny.host = '0.0.0.0'))" > /usr/lib/R/etc/Rprofile.site
RUN addgroup --system app \
    && adduser --system --ingroup app app
WORKDIR /home/app
COPY app .
RUN chown app:app -R /home/app
USER app
EXPOSE 3838
CMD ["R", "-e", "shiny::runApp('/home/app')"]

按以下方式进行构建

# name of the image
export IMAGE="yorks0n/trxiv_shiny"

# build image
docker build -t $IMAGE .

# run and test locally
docker run -p 8080:3838 $IMAGE

居然就行了!

部署在 Railway 上

# 安装
brew install railway

# 登录
railway login

创建一个项目,并输入项目名称

➜ railway init
> Project Name TRxiv_shiny
Created project TRxiv_shiny on Personal

虽然当前目录下有个 Dockerfile 了,但是这 XX 的 railway 部署时候端口和默认 docker 的不太一样,或者我没找到哪里设置,所以如果要部署在 railway 上,还需要改一下 Dockerfile。虽然在这指定了ENV PORT=3838,但实际上 railway 每次开的端口都不太一样,所以标准 docker 的写法不太行。

FROM rocker/r-base:latest
LABEL maintainer="Yorkson <yorks0n@qq.com>"
RUN apt-get update && apt-get install -y --no-install-recommends \
    sudo \
    libcurl4-gnutls-dev \
    libcairo2-dev \
    libxt-dev \
    libssl-dev \
    libssh2-1-dev \
    && rm -rf /var/lib/apt/lists/*
RUN install.r shiny shinyBS dplyr stringr
RUN addgroup --system app \
    && adduser --system --ingroup app app
WORKDIR /home/app
COPY app .
RUN chown app:app -R /home/app
USER app
EXPOSE 3838
ENV PORT=3838
# 研究后发现,这里以获取PORT的方式,才能在 Railway 中部署
CMD ["R", "-e", "shiny::runApp('/home/app', host = '0.0.0.0', port=as.numeric(Sys.getenv('PORT')))"]
railway up

参考资料

在Windows系统下,基于WLS从零开始部署我的 R shiny项目到 Docker 中,并将镜像发布到 Docker Hub(内附详细操作流程)_douerw的博客-CSDN博客

Dockerizing Shiny Applications

Dockerized Shiny Apps with Dependencies