Apache OpenWhisk 2.0.0 Docker Compose 部署指南

使用 Docker Compose 在 Ubuntu 22.04 上部署 Apache OpenWhisk 2.0.0 单机 standalone 服务,涵盖 Dockerfile 与 docker-compose.yml 编写、镜像构建、compose up/down 生命周期管理、端口与数据目录、函数端到端验证及实例名/网络/内存三类常见排障,命令与回显均实测

Apache OpenWhiskApache OpenWhisk2026/10/12

Apache OpenWhisk 2.0.0 Docker Compose 部署指南

目标:在 Ubuntu 22.04 服务器上使用 Docker Compose 部署 Apache OpenWhisk 2.0.0 单机 standalone 服务,实现一条命令拉起、函数端到端可用、生命周期可视化管理。以下 Dockerfile、compose 编排与全部回显均在真实环境逐步实测。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • Docker:29.1.3(含 compose 插件 v5.5.1)
  • Apache OpenWhisk:2.0.0(standalone 单机模式,openwhisk-standalone.jar)
  • wsk CLI:1.2.0
  • 基础映像:ubuntu:22.04;应用映像:openwhisk-standalone:2.0.0
  • 实例名:ow-standalone;compose 工程名:ow-compose
  • 端口:3233(Controller / API)、3232(Playground UI)
  • 运行用户:root(示例账号:root,密码:q1w2e3r4)

💡 前提:先按《Ubuntu 22.04 安装 Apache OpenWhisk 2.0.0 指南》构建出 openwhisk-standalone.jar 并准备好 wsk CLI 二进制,本文假定二者已存在(位于 /opt/OpenWhisk-2.0.0/bin/ 与 /usr/local/bin/wsk),同时已准备函数运行时映像 openwhisk/action-nodejs-v20:1.22.0。

二、编排文件准备

2.1 Dockerfile

创建目录 /opt/ow-compose,编写 Dockerfile:

mkdir -p /opt/ow-compose
cd /opt/ow-compose

Dockerfile 内容:

FROM ubuntu:22.04

RUN apt-get update -qq && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y -qq \
        openjdk-11-jdk docker.io curl unzip net-tools procps && \
    rm -rf /var/lib/apt/lists/*

ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 \
    PATH=/usr/local/bin:/usr/bin:/bin

COPY openwhisk-standalone.jar /opt/openwhisk/bin/openwhisk-standalone.jar
COPY wsk /usr/local/bin/wsk

WORKDIR /opt/openwhisk
EXPOSE 3233 3232
CMD ["java", "-jar", "/opt/openwhisk/bin/openwhisk-standalone.jar"]

说明:映像内安装 docker.io 是为了让 standalone 的 invoker 能通过 docker.sock 拉起函数运行时;openwhisk-standalone.jar 与 wsk 二进制需提前放入构建上下文目录。

2.2 docker-compose.yml

docker-compose.yml 内容(实测最终版):

services:
  openwhisk:
    build: .
    image: openwhisk-standalone:2.0.0
    container_name: ow-standalone
    restart: unless-stopped
    network_mode: host
    environment:
      JAVA_TOOL_OPTIONS: "-Djava.io.tmpdir=/opt/tmp -Xms256m -Xmx512m"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
配置项值说明
container_nameow-standalone实例名,不可包含 whisk- 子串,否则会被 standalone 启动时的 support 实例清理逻辑误删
network_modehost复用宿主机网络,standalone 探测到的本机 IP 可直接绑定(bridge 网络会因探测到网桥 IP 而绑定失败)
JAVA_TOOL_OPTIONS-Djava.io.tmpdir=/opt/tmp -Xms256m -Xmx512m临时目录规避 tmpfs mmap 问题;JVM 堆限制 256–512MB
volumes/var/run/docker.sock让 invoker 使用宿主机运行时拉起函数运行环境

⚠️ version: '3.8' 顶层键在 compose v5.5.1 下提示 obsolete(会被忽略),可省略不写。

2.3 构建上下文

cp /opt/OpenWhisk-2.0.0/bin/openwhisk-standalone.jar /opt/ow-compose/
cp /usr/local/bin/wsk /opt/ow-compose/
ls /opt/ow-compose

回显:

Dockerfile
docker-compose.yml
openwhisk-standalone.jar
wsk

三、构建与启动

cd /opt/ow-compose
docker compose up -d --build

构建与启动回显:

 Image openwhisk-standalone:2.0.0 Building
Sending build context to Docker daemon    158MB
Step 1/9 : FROM ubuntu:22.04
 ---> e8df6c74f650
Step 2/9 : RUN apt-get update -qq &&     DEBIAN_FRONTEND=noninteractive apt-get install -y -qq         openjdk-11-jdk docker.io curl unzip net-tools procps &&     rm -rf /var/lib/apt/lists/*
 ---> Using cache
 ---> 20c0e7a9a927
Step 3/9 : ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64     PATH=/usr/local/bin:/usr/bin:/bin
 ---> Using cache
 ---> 1053598d64e4
Step 4/9 : COPY openwhisk-standalone.jar /opt/openwhisk/bin/openwhisk-standalone.jar
 ---> Using cache
 ---> 36b6f9ddfcec
Step 5/9 : COPY wsk /usr/local/bin/wsk
 ---> Using cache
 ---> 64c16d9c5f03
Step 6/9 : WORKDIR /opt/openwhisk
 ---> Using cache
 ---> 3b2677fb0fe0
Step 7/9 : EXPOSE 3233 3232
 ---> Using cache
 ---> 117498973101
Step 8/9 : CMD ["java", "-jar", "/opt/openwhisk/bin/openwhisk-standalone.jar"]
 ---> Using cache
 ---> 569f3ff9980d
Step 9/9 : LABEL com.docker.compose.image.builder=classic
 ---> Using cache
 ---> 3b2b9e623457
Successfully built 3b2b9e623457
Successfully tagged openwhisk-standalone:2.0.0
 Image openwhisk-standalone:2.0.0 Built
 Container ow-standalone Created
 Container ow-standalone Starting
 Container ow-standalone Started

查看服务状态:

docker compose ps

回显:

NAME            IMAGE                        COMMAND                  SERVICE     CREATED          STATUS          PORTS
ow-standalone   openwhisk-standalone:2.0.0   "java -jar /opt/open…"   openwhisk   52 seconds ago   Up 45 seconds

docker compose ps 首次执行可能输出一条 version is obsolete 警告,忽略即可。

四、验证服务可用

4.1 查看启动日志

docker logs ow-standalone | grep -E "Launched service|Controller started|Created user"

回显(节选):

[  OK   ] Server port [3233] is free
Launched service details
[ 3233  ] http://172.18.0.1:3233 (Controller)
[ 3232  ] http://172.18.0.1:3232/playground (Playground)
[2026-10-11T19:04:33.239Z] [INFO] [StandaloneOpenWhisk] Created user [guest]
[2026-10-11T19:04:33.301Z] [INFO] [StandaloneOpenWhisk] Created user [whisk.system]

invoker 预热回显(docker logs ow-standalone | grep prewarm):

[2026-10-11T19:06:01.895Z] [INFO] [DockerClientWithFileAccess] running /usr/bin/docker run -d
  --cpu-shares 256 --memory 256m --memory-swap 256m --network bridge
  -e __OW_API_HOST=http://172.18.0.1:3233 --name wsk0_1_prewarm_nodejs20
  --pids-limit 1024 --cap-drop NET_RAW --cap-drop NET_ADMIN
  --ulimit nofile=1024:1024 --log-driver json-file openwhisk/action-nodejs-v20:1.22.0

日志中的 172.18.0.1 为实测环境的本机地址,请以实际服务器 IP 为准。

4.2 探测 API

curl -s -o /dev/null -w "%{http_code}" http://172.18.0.1:3233/api/v1/namespaces

回显:

401

401 表示 API 端口已监听并返回鉴权要求,属正常(需带 guest 凭据)。

4.3 配置 wsk 并创建函数

wsk property set --apihost http://172.18.0.1:3233
wsk property set --auth 23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwP

编写函数并创建 action:

cat > /tmp/hello.js <<'EOF'
function main(params) {
  const name = params.name || "stranger";
  return { greeting: "Hello, " + name + "!" };
}
EOF

wsk action create hello /tmp/hello.js --kind nodejs:20

回显:

ok: created action hello

4.4 调用函数

wsk action invoke hello --blocking --result -p name Compose

回显:

{
    "greeting": "Hello, Compose!"
}

4.5 查看调用记录

wsk activation list

回显:

Datetime            Activation ID                    Kind      Start Duration   Status  Entity
2026-10-11 19:07:11 abe34729610e4f4ba34729610e2f4b73 nodejs:20 cold  417ms      success guest/hello:0.0.1

至此 Compose 部署的函数链路完全打通。

五、常用管理操作

5.1 查看工程配置

cd /opt/ow-compose && docker compose config

回显(节选):

name: ow-compose
services:
  openwhisk:
    build:
      context: /opt/ow-compose
      dockerfile: Dockerfile
    container_name: ow-standalone
    environment:
      JAVA_TOOL_OPTIONS: -Djava.io.tmpdir=/opt/tmp -Xms256m -Xmx512m
    image: openwhisk-standalone:2.0.0
    network_mode: host
    restart: unless-stopped
    volumes:
      - type: bind
        source: /var/run/docker.sock
        target: /var/run/docker.sock

5.2 停止与移除

cd /opt/ow-compose && docker compose down

回显:

 Container ow-standalone Stopped
 Container ow-standalone Removing
 Container ow-standalone Removed

5.3 重新启动

docker compose up -d

restart: unless-stopped 保证宿主机重启后服务自动拉起;docker compose down 后需再次 up -d。

六、注意事项

  • 实例名不能包含 whisk- 子串:standalone 启动时会执行 docker ps --filter name=whisk- 并清理匹配的 support 实例,实例名含该子串会被误删(exit 137)。
  • 使用 network_mode: host:standalone 会绑定其探测到的本机 IP;bridge 网络下探测到的是宿主机网桥 IP,实例内绑定会报 BindException: Cannot assign requested address。
  • 不宜设 mem_limit:JVM 堆 + 预热实例(默认 2 个 wsk0_*_prewarm_nodejs20)内存叠加易触发宿主 OOM,堆大小由 JAVA_TOOL_OPTIONS 的 -Xms256m -Xmx512m 控制。
  • standalone 为内存存储:服务重启后已创建的 action / trigger / rule 全部丢失,需重新创建(docker compose restart 亦然)。
  • 冷启动函数依赖运行时映像:确保 openwhisk/action-nodejs-v20:1.22.0 已存在于本地,否则首次调用会因拉取失败报 HTTP 500 冷启动失败。

七、常见问题

7.1 实例启动数秒后被自动删除(exit 137)

原因:实例名含 whisk- 子串,被 standalone 启动时的 support 实例清理逻辑误杀。

解决:改用不含 whisk- 的实例名,如 ow-standalone。

7.2 启动报 BindException: [/172.18.0.1:3232] Cannot assign requested address

原因:bridge 网络下实例内不存在宿主机网桥 IP,standalone 无法绑定探测到的地址。

解决:在 docker-compose.yml 中设置 network_mode: host。

7.3 首次调用函数报 HTTP 500 / 冷启动失败

原因:函数运行时映像缺失,冷启动尝试从公网拉取失败。

解决:提前导入 openwhisk/action-nodejs-v20:1.22.0 映像并确认 pull-standard-images = false(见安装指南 4.5 节)。

7.4 重启后 action 丢失

原因:standalone 使用内存存储。

解决:属正常特性,重启后重新执行 wsk action create 即可。

7.5 docker compose ps 提示 version is obsolete

原因:compose 新版本忽略 version 顶层键。

解决:删除 version: '3.8' 行即可,不影响功能。

八、卸载

cd /opt/ow-compose
docker compose down --rmi all --volumes
rm -rf /opt/ow-compose

九、参考链接