如何将 docker 与音量和设备一起用作 Openwhisk 中的操作

How to use docker with volume and device as an action in the Openwhisk

我在 docker 中有一些代码可以轮询目录以对其执行一些操作。 此目录使用 -v 选项传递,而 运行 docker 也有一些设备使用 --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl

在 wsk docker 操作中,我看到要创建一个 docker 操作,我使用如下命令 wsk -i 动作创建 --docker

我想了解如何将音量和设备信息传递给 docker,因为此 docker 的启动和停止将由 openwhisk 维护。 或者是否有其他一些解决方法

OpenWhisk 不支持带有附加卷的基于​​ 运行 Docker 的操作。用户对存储设备没有任何控制权。

解决方法是使用对象存储作为存储位置。然后,OpenWhisk 操作可以使用 API 从无服务器运行时查询、检索和修改数据。

老问题,但我留下了一个注释,对于本地测试部署,我有 OpenWhisk 运行 安装的 NFS 网络文件系统和本地路径。为此,我只是简单地将安装添加到源代码中(硬编码,可以进行 ENV 设置,下一步):

在此处添加 volume mounts -v: 文件:core/invoker/src/main/scala/whisk/core/containerpool/docker/DockerContainer.scala

    val args = Seq(
    "--cpu-shares",
    cpuShares.toString,
    "--memory",
    s"${memory.toMB}m",
    "--memory-swap",
    s"${memory.toMB}m",
    "--network",
    network,
    "-v",
    "/mnt/nfs:/mnt/nfs",
    "-v",
    "/mnt/data:/mnt/data") ++
    environmentArgs ++
    dnsServers.flatMap(d => Seq("--dns", d)) ++
    name.map(n => Seq("--name", n)).getOrElse(Seq.empty) ++
    params

然后 运行 在 openwhisk-master 目录中构建它:

./gradlew distdocker 

并标记生成的调用程序容器以便在堆栈中使用它:

docker tag whisk/invoker openwhisk/invoker

重启后,您就有了卷。

但请注意:这与无状态微服务的设计原则相矛盾,可能不是最明智的做法。 Re-check 如果你可以不安装卷(它们不是无状态的)。