2

我正在用 Snakemake 构建管道。一条规则涉及一个 R 脚本,该脚本使用readr. 当我使用--use-singularityand运行管道时出现此错误--use-conda

Error: Unknown TZ UTC
In addition: Warning message:
In OlsonNames() : no Olson database found
Execution halted

谷歌建议readr由于缺少tzdata而崩溃,但我不知道如何安装 tzdata 包并readr查看它。我在Mambaforge容器中运行整个管道以确保可重复性。Snakemake 建议在 Miniconda 容器上使用 Mambaforge,因为它更快,但我认为我的错误涉及 Mambaforge,因为使用 Miniconda 可以解决错误。

这是重现错误的工作流程:

#Snakefile
singularity: "docker://condaforge/mambaforge"

rule targets:
    input:
        "out.txt"

rule readr:
    input:
        "input.csv"
    output:
        "out.txt"
    conda:
        "env.yml"
    script:
        "test.R"
#env.yml
name: env
channels:
    - default
    - bioconda
    - conda-forge
dependencies:
    - r-readr
    - tzdata
#test.R
library(readr)
fp <- snakemake@input[[1]]
df <- read_csv(fp)
print(df)
write(df$x, "out.txt")

我使用snakemake --use-conda --use-singularity. 当 Snakemake 工作流从 Mambaforge 奇点容器运行时,如何运行 R 脚本?

4

1 回答 1

0

查看导致错误的 R 代码堆栈,我看到它检查了包含zoneinfo文件夹的一堆默认位置tzdata,但也检查了TZDIR环境变量。

我相信一个适当的解决方案是让 Condatzdata包将此变量设置为指向它。这将需要对 Conda Forge 包的 PR(参见repo issue)。同时,可以执行以下任一方法作为解决方法。

解决方法 1:从 R 设置 TZDIR

继续使用tzdata来自 Conda 的包,可以在 R 脚本的开头设置环境变量。

#!/usr/bin/env Rscript

## the following assumes active Conda environment with `tzdata` installed
Sys.setenv("TZDIR"=paste0(Sys.getenv("CONDA_PREFIX"), "/share/zoneinfo"))

我认为这是一个临时的解决方法。

解决方法 2:派生新的 Docker

否则,制作一个包含系统级 tzdata 安装的新 Docker 映像。这似乎是一个常见问题,因此按照其他示例(并保持清洁),它会变成这样:

Dockerfile

FROM --platform=linux/amd64 condaforge/mambaforge:latest

## include tzdata
RUN apt-get update > /dev/null \
  && DEBIAN_FRONTEND="noninteractive" apt-get install --no-install-recommends -y tzdata > /dev/null \
  && apt-get clean

将其上传到 Docker Hub 并使用它而不是 Mambaforge 图像作为 Snakemake 的图像。这可能是一个更可靠的长期解决方案,但也许不是每个人都想创建一个 Docker Hub 帐户。

于 2021-06-23T00:19:10.263 回答