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.8 | OpenJDK 11 (LTS) |
| Docker | 18.06 | 20.10+ |
| Cromwell | — | 最新稳定版 (如 85+) |
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 生效。
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 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。
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 环境搭建流程图
下面这张图把整个依赖关系串起来,方便你对照检查:
2.8 常见问题排查
搭建过程中如果遇到问题,可以参考下面的表格快速定位:
| 现象 | 原因 | 解决 |
|---|---|---|
| java: command not found | Java未安装或PATH未设 | 安装JDK并配置JAVA_HOME |
| Unsupported major.minor version | Java版本过新或过旧 | 换成OpenJDK 11 |
| docker: Cannot connect to the Docker daemon | Docker服务未启动或当前用户不在docker组 | systemctl start docker 或 sudo usermod -aG docker $USER |
| Cromwell启动后立即退出,无报错 | 默认JVM堆内存不足 | 加上 -Xmx2g 参数 |
| 端口8000被占用 | 其他服务占用端口 | 修改启动命令:java -Dcromwell.port=8080 -jar cromwell.jar server |