Apache OpenWhisk 中 Docker 动作的创建与使用指南
概述
Apache OpenWhisk 是一个强大的无服务器计算平台,它允许开发者通过 Docker 容器来创建自定义的动作(Action)。本文将详细介绍如何在 OpenWhisk 中创建和使用 Docker 动作,包括从基础概念到实际操作的全过程。
Docker 动作的优势
使用 Docker 动作可以带来以下优势:
- 语言无关性:可以使用任何编程语言开发动作
- 依赖管理:能够包含大型或复杂的依赖库
- 环境定制:完全自定义运行时环境
- 性能优化:针对特定工作负载优化执行环境
准备工作
在开始之前,需要确保:
- 拥有有效的 Docker 容器仓库账户
- 本地已安装 Docker 和 OpenWhisk CLI 工具
- 了解基本的 Docker 概念和操作
使用 OpenWhisk Docker 骨架
OpenWhisk 提供了一个 Docker 骨架(Skeleton),这是一个预配置的 Docker 镜像模板,基于 Python 3.6.1 Alpine 版本,可以帮助开发者快速上手。
1. 安装 Docker 骨架
执行以下命令获取骨架文件:
wsk sdk install docker
安装完成后,当前目录下会生成 dockerSkeleton
文件夹,包含以下文件:
Dockerfile
:Docker 镜像构建文件README.md
:说明文档buildAndPush.sh
:构建和推送镜像的脚本example.c
:示例 C 程序
2. 理解动作执行机制
Docker 动作的执行遵循以下约定:
- 可执行文件必须位于容器内的
/action/exec
路径 - 输入参数通过命令行参数传递,格式为 JSON 字符串
- 执行结果必须通过 stdout 输出,格式为单行 JSON 字符串
- 可以通过 stderr 输出日志信息
3. 示例程序解析
骨架中包含的 example.c
是一个简单的 C 程序示例:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("This is an example log message from an arbitrary C program!\n");
printf("{ \"msg\": \"Hello from arbitrary C program!\", \"args\": %s }",
(argc == 1) ? "undefined" : argv[1]);
}
这个程序展示了如何处理输入参数和生成符合要求的输出。
构建和部署 Docker 动作
1. 构建自定义镜像
开发者可以修改 example.c
或添加其他代码文件,然后通过修改 Dockerfile
来构建自定义镜像。构建过程会自动编译 C 程序,无需本地安装编译器。
2. 推送镜像到容器仓库
首先登录容器仓库:
docker login -u <用户名> -p <密码>
然后执行构建和推送脚本:
cd dockerSkeleton
./buildAndPush.sh <用户名>/<镜像名>
3. 创建 OpenWhisk 动作
镜像推送成功后,可以创建对应的 OpenWhisk 动作:
wsk action create example --docker <用户名>/<镜像名>
调用 Docker 动作
Docker 动作的调用方式与其他 OpenWhisk 动作完全相同:
wsk action invoke --result example --param payload Rey
预期输出:
{
"args": {
"payload": "Rey"
},
"msg": "Hello from arbitrary C program!"
}
更新 Docker 动作
更新 Docker 动作需要两个步骤:
- 重新构建和推送镜像:
./buildAndPush.sh <用户名>/<镜像名>
- 更新 OpenWhisk 动作:
wsk action update example --docker <用户名>/<镜像名>
注意:如果不执行更新操作,已存在的热容器会继续使用旧版本的镜像,只有新创建的容器才会使用最新镜像。
原生动作创建
除了使用自定义镜像,还可以将可执行文件直接打包并创建原生 Docker 动作:
wsk action create example exec.zip --native
这等价于:
wsk action create example exec.zip --docker openwhisk/dockerskeleton
这种方式适用于:
- Bash 脚本
- 交叉编译的二进制文件
- 其他与
openwhisk/dockerskeleton
镜像兼容的可执行文件
最佳实践
- 日志输出:合理使用 stdout 和 stderr 输出日志信息
- 错误处理:确保程序在各种情况下都能返回有效的 JSON 结果
- 性能优化:考虑容器预热和冷启动的影响
- 资源管理:根据动作需求合理配置内存和时间限制
总结
通过 OpenWhisk 的 Docker 动作功能,开发者可以突破平台内置运行时的限制,实现高度定制化的无服务器函数。无论是使用预定义的骨架还是完全自定义的镜像,都能灵活地满足各种复杂场景的需求。掌握 Docker 动作的开发流程,将大大扩展 OpenWhisk 的应用范围。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考