Docker化Golem构建的Shiny App时Bootstrap资源链接问题
Docker化Golem+Shiny应用时SCSS无法解析Bootstrap依赖的问题
我正尝试将使用{golem}构建的Shiny应用(已打包为库)进行Docker化,但遇到问题:custom.scss文件中包含Bootstrap依赖(如@include media-breakpoint-up(lg)),这些依赖在本地环境可自动关联,但在Docker容器中无法正常识别。应用同时使用了{bslib}。
本地安装运行应用时一切正常(即使在远程服务器上),但Docker化后无法解析custom.scss文件,与Bootstrap依赖的关联失效。启动应用时的错误信息:
Error: File to import not found or unreadable: /tmp/RtmpWzfgRD/R.INSTALL682a228ec/<APPNAME>/inst/app/www/custom.scss. on line 71:1 of /stdin >> @import "/tmp/RtmpWzfgRD/R.INSTALL682a228ec/<APPNAME>/inst/app/www/custom.scs ^
当前主题构建代码(app_ui.R)
bslib::bs_theme(version = 5, preset = "bootstrap") |> bslib::bs_add_rules(sass::sass_file("./inst/app/www/custom.scss")) # add complementary scss file
已尝试的方案
- 本地应用运行完全正常,custom.scss可被正确解析,
@include media-breakpoint-up(lg)功能符合预期,且custom.scss内未显式导入Bootstrap依赖; - 将完整Bootstrap仓库添加到应用中,并在custom.scss中通过
@import 'bootstrap-main/scss/bootstrap';导入:应用可正常启动,但主题被严重破坏,几乎无法识别; - 只要不包含
@include media-breakpoint-up(lg)调用,Docker容器中的应用即可正常运行。
Docker配置文件
Dockerfile_base
FROM rocker/verse:4.4.1 RUN apt-get update -y && apt-get install -y make pandoc zlib1g-dev libicu-dev libxml2-dev libx11-dev git libcurl4-openssl-dev libssl-dev libfontconfig1-dev libfreetype6-dev libfribidi-dev libharfbuzz-dev libjpeg-dev libpng-dev libtiff-dev libgdal-dev gdal-bin libgeos-dev libproj-dev libsqlite3-dev libudunits2-dev && rm -rf /var/lib/apt/lists/* RUN mkdir -p /usr/local/lib/R/etc/ /usr/lib/R/etc/ RUN echo "options(renv.config.pak.enabled = FALSE, repos = c(CRAN = 'https://cran.rstudio.com/'), download.file.method = 'libcurl', Ncpus = 4)" | tee /usr/local/lib/R/etc/Rprofile.site | tee /usr/lib/R/etc/Rprofile.site RUN R -e 'install.packages("remotes")' RUN R -e 'remotes::install_version("renv", version = "1.0.11")'
Dockerfile
FROM energyvd_base COPY renv.lock renv.lock RUN R -e 'options(renv.config.pak.enabled = FALSE);renv::restore(exclude = "eneRgyVD")' COPY eneRgyVD_*.tar.gz /app.tar.gz RUN R -e 'remotes::install_local("/app.tar.gz",upgrade="never")' RUN rm /app.tar.gz EXPOSE 80 USER rstudio CMD R -e "options('shiny.port'=80,shiny.host='0.0.0.0');library(eneRgyVD);eneRgyVD::run_app()"
运行步骤
docker build -f Dockerfile_base --progress=plain -t energyvd_base . docker build -f Dockerfile --progress=plain -t energyvd:latest . docker run -p 80:80 energyvd:latest
补充进展
我通过以下代码生成了不会破坏主题的custom.css文件:
sass::sass(input = sass::sass_file("inst/app/www/custom.scss"), output = "inst/app/www/custom.css", cache = NULL, options = sass::sass_options( include_path = system.file("lib/bs5/scss/", package = "bslib")))
之后可使用custom.css替代custom.scss,代码如下:
bslib::bs_theme(version = 5) |> bslib::bs_add_rules(sass::sass_file("inst/app/www/custom.css"))
这仍未完全满足需求,我希望直接引用.scss文件,无需手动转换为.css,但已接近解决!
内容的提问来源于stack exchange,提问作者Michaël
相关产品推荐
相关产品推荐

