我正在尝试对用
{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 中的 Bootstrap 问题。事情是这样的:
您的 Bootstrap 无法与 Docker 很好地配合,但不用担心!以下是一些实用的解决方案:
将这些 Bootstrap 导入添加到您的
custom.scss
:
@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/mixins";
// Rest of your styles here...
像这样调整你的
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...
}
将其添加到您的 Dockerfile 中:
# ... your existing Dockerfile stuff ...
# Installing Bootstrap
RUN R -e 'bslib::bs_theme_dependencies()'
# ... rest of the file ...
bslib
是否正确列在您的 renv.lock
要在开发过程中进行快速 SCSS 测试,请使用以下命令:
docker run -p 80:80 -v $(pwd)/inst/app/www:/app/www energyvd:latest