2. Cromwell环境搭建:Java与Docker安装、Cromwell下载与启动

搭建Cromwell环境,说白了就是把它的几个依赖先装好。我见过不少新手一上来就急着下载Cromwell的jar包,结果启动时报错,才发现Java版本不对或Docker没装。这课我们一步一步来,别急。

2.1 前置依赖一览

Cromwell本身是用Scala写的,跑在JVM上。它调度任务时默认会调用Docker容器来执行具体命令。所以核心依赖就两样:Java 8/11(推荐11)和Docker。下表是各组件的最低版本要求:

组件最低版本我推荐的版本
Java (JDK/JRE)1.8OpenJDK 11 (LTS)
Docker18.0620.10+
Cromwell—最新稳定版 (如 85+)
我的经验:Java 8也能用,但Cromwell 86之后对Java 11有更好的GC优化。我个人习惯直接装OpenJDK 11,省得以后再升级。

2.2 安装Java

先确认系统里有没有Java。打开终端敲:

java -version

如果输出类似 openjdk version "11.0.18" 那就省事了。如果没有,按下面步骤装。

Ubuntu/Debian:

sudo apt update
sudo apt install openjdk-11-jdk -y

CentOS/RHEL:

sudo yum install java-11-openjdk-devel -y

macOS(用Homebrew):

brew install openjdk@11

装完之后再跑一次 java -version 确认。注意设置 JAVA_HOME 环境变量,很多工具会依赖它。我一般加在 ~/.bashrc 或 ~/.zshrc 里:

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64   # 路径依系统而定
export PATH=$JAVA_HOME/bin:$PATH

然后执行 source ~/.bashrc 生效。

我曾经踩过的坑:有一次在服务器上装了OpenJDK 17,Cromwell启动直接报“Unsupported class file major version 61”。后来才发现Cromwell 85只支持到Java 11。千万别装太新的Java版本,除非你确认Cromwell已经适配。

2.3 安装Docker

Docker负责拉取镜像、跑任务容器。没有它,Cromwell只能做本地后端模拟,没法真正调度WDL任务。

Ubuntu快速安装:

sudo apt update
sudo apt install docker.io -y
sudo systemctl start docker
sudo systemctl enable docker

macOS:直接从官网下载Docker Desktop安装就行。

装完验证:

sudo docker run hello-world

能看到Hello from Docker!就OK了。

注意权限:普通用户直接跑docker需要sudo。如果你不想每次加sudo,把用户加入docker组:

sudo usermod -aG docker $USER
# 然后退出终端再重新登录
我的建议:刚装好Docker时,记得检查一下存储驱动。默认overlay2一般没问题,但如果是老内核,可能要用devicemapper,那性能会差很多。用 docker info 可以查看。

2.4 下载Cromwell

Cromwell发布在GitHub的release页面。我个人习惯直接用wget下载最新jar包:

wget https://github.com/broadinstitute/cromwell/releases/download/85/cromwell-85.jar

如果觉得版本号不好记,也可以去 https://github.com/broadinstitute/cromwell/releases/latest 找最新的链接。

下载完成后,随便放在一个目录,比如 ~/tools/cromwell/。我习惯建一个软链:

ln -s ~/tools/cromwell/cromwell-85.jar ~/tools/cromwell/cromwell.jar

这样以后升级版本时,只改软链目标就行,不用改脚本里的路径。

2.5 启动Cromwell

Cromwell有两种运行模式:单机模式(Run)和服务器模式(Server)。我们先说单机模式,后面课程再讲Server。

单机模式:适合一次性提交一个WDL工作流,跑完就退出。

java -jar cromwell.jar run my_workflow.wdl --inputs inputs.json

服务器模式:以后台服务形式运行,接受REST API请求。

java -jar cromwell.jar server &

启动后默认监听 localhost:8000。你可以用浏览器访问 http://localhost:8000 看到Swagger UI。

启动参数小贴士:如果任务量大,建议加上JVM内存参数:
java -Xmx4g -Xms4g -jar cromwell.jar server
我遇到过默认512M堆不够用,直接OOM崩溃。至少给2G起步。

2.6 验证安装

写一个最简单的WDL文件 hello.wdl:

task hello {
    command {
        echo "Hello Cromwell!"
    }
    output {
        String out = read_string(stdout())
    }
}
workflow my_workflow {
    call hello
}

提交运行:

java -jar cromwell.jar run hello.wdl

如果看到输出中包含 "Hello Cromwell!",恭喜,环境跑通了!

2.7 环境搭建流程图

下面这张图把整个依赖关系串起来,方便你对照检查:

Cromwell环境依赖与搭建流程 Java 11 (JDK) Docker 20.10+ 下载 Cromwell JAR (v85+) 单机模式 (run) 服务器模式 (server) 运行 hello.wdl 验证通过 ✓ 注意JVM内存

2.8 常见问题排查

搭建过程中如果遇到问题,可以参考下面的表格快速定位:

现象原因解决
java: command not foundJava未安装或PATH未设安装JDK并配置JAVA_HOME
Unsupported major.minor versionJava版本过新或过旧换成OpenJDK 11
docker: Cannot connect to the Docker daemonDocker服务未启动或当前用户不在docker组systemctl start docker 或 sudo usermod -aG docker $USER
Cromwell启动后立即退出,无报错默认JVM堆内存不足加上 -Xmx2g 参数
端口8000被占用其他服务占用端口修改启动命令:java -Dcromwell.port=8080 -jar cromwell.jar server
再次提醒:如果你在服务器上用普通用户运行Cromwell,Docker权限是最容易忽略的点。我曾经花了一上午排查为什么Cromwell提交的任务全是“waiting for resource”,最后发现是docker socket连不上。解决办法就是上面提到的把用户加入docker组。