如何将引导资源链接到用 golem 制作的 Docker 化闪亮应用程序?

问题描述 投票:0回答:1

我正在尝试对用

{golem}
制作的闪亮应用程序进行 dockerize(该应用程序打包为库),但我遇到了问题,因为我的
custom.scss
文件中有一些引导程序依赖项(例如
@include media-breakpoint-up(lg)
)而且在本地工作时,这些依赖项似乎无法在 docker 容器内自动链接。我也在应用程序内使用
{bslib}

在本地安装/运行应用程序时(即使在远程服务器上),一切都运行顺利,但是当尝试对应用程序进行 dockerize 时,它无法解释

custom.scss
文件,与引导程序依赖项的链接不起作用。听应用程序时的错误是
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

可以在此处查看

.scss
文件(在 GitHub 上的此版本中称为
custom_bs5.scss
):https://github.com/mick-weber/eneRgyVD/blob/main/inst/app/www/custom_bs5。 scss

我已经实现了以下目标:

  • 该应用程序在本地完美运行,

    custom.scss
    被正确解释,并且
    @include media-breakpoint-up(lg)
    功能按预期工作,尽管内部没有显式导入引导程序依赖项
    custom.scss

  • 在应用程序中添加整个 bootstrap github 存储库,并使用

    custom.scss
    @ import 'bootstrap-main/scss/bootstrap';
    导入它:这会正确启动应用程序,但会严重扰乱整个主题,我几乎无法识别该应用程序。

  • 只要不提及这些

    @include media-breakpoint-up(lg)
    调用,docker 容器内的应用程序就可以正常工作。 dockerfile 包含所有 R 库(已加载
    renv.lock
    ),请参阅下面的 dockerfiles 内容

我有什么遗漏的吗?为什么我的 docker 容器无法在

@include media-breakpoint-up(lg)
查询和引导文件之间建立相同的隐式链接?如果必须建立任何显式链接,我应该如何建立它们(例如
@import ...
但链接到我的 docker 容器中的哪些文件?)

Dockerfiles 是用

golem::add_dockerfile_with_renv(lockfile = 'renv.lock')
:

生成的

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
docker shiny bootstrap-5 bslib
1个回答
0
投票

让我帮助您解决 Docker 中的 Bootstrap 问题。事情是这样的:

您的 Bootstrap 无法与 Docker 很好地配合,但不用担心!以下是一些实用的解决方案:

方案一:直接导入

将这些 Bootstrap 导入添加到您的

custom.scss
:

@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/mixins";

// Rest of your styles here...

解决方案2:使用bslib的路径

像这样调整你的

app_ui.R

app_ui <- function(request) {
  bslib::bs_theme(version = 5, preset = "bootstrap") |>
    bslib::bs_add_rules(
      sass::sass_file(
        "inst/app/www/custom.scss",
        options = sass::sass_options(
          include_path = system.file("node_modules", package = "bslib")
        )
      )
    )
  # Rest of your UI code...
}

解决方案 3:在 Docker 中引导

将其添加到您的 Dockerfile 中:

# ... your existing Dockerfile stuff ...

# Installing Bootstrap
RUN R -e 'bslib::bs_theme_dependencies()'

# ... rest of the file ...

发生了什么事:

  • Docker 找不到在你的机器上正常工作的 Bootstrap 依赖项
  • 错误显示它无法在该临时目录中找到 SCSS 文件
  • 显式导入或使用 bslib 文件将解决此问题
  • 仔细检查
    bslib
    是否正确列在您的
    renv.lock

专业提示:

要在开发过程中进行快速 SCSS 测试,请使用以下命令:

docker run -p 80:80 -v $(pwd)/inst/app/www:/app/www energyvd:latest
© www.soinside.com 2019 - 2024. All rights reserved.