tjtjtjのメモ

自分のためのメモです

docker function

作成済みのコンテナにパラメータを与え、実行に影響を与えたい。調べたら標準入力が使えそうだったのでやってみた。

docker start http://docs.docker.jp/engine/reference/commandline/start.html

基本

‘‘‘ $ docker run alpine:3.9 echo 'Hello World' Hello World

## docker run で hello, world

標準入力に与えた文字列を加工した標準出力が得られた。

$ echo qwer | docker run -i --rm dhello:1 hello, qwer

## docker run で足し算

標準入力を引数に、標準出力を戻り値に見立てて足し算する。

$ echo '{"x":11,"y":22}' | docker run --rm -i dplus:1 {"X":11,"Y":22,"Z":33}

## docker create, start で足し算

作成済みコンテナを関数に見立てる。

$ docker create -i dplus:1 b008a78e1829fbc75b79e1b2b6e56a84bfafe1c16550acc97de2de5797f0567e $ echo '{"x":1,"y":2}' | docker start -i b00 {"X":1,"Y":2,"Z":3} $ echo '{"x":30,"y":40}' | docker start -i b00 {"X":30,"Y":40,"Z":70} $ docker logs b00 {"X":1,"Y":2,"Z":3}{"X":30,"Y":40,"Z":70}

## OpenFaaS

ここまで出来たら関数と言っていいんじゃないか。
調べたらopenfaasも標準入出力を引数戻り値に見立てているようだ。

https://github.com/openfaas/faas/tree/master/watchdog#watchdog

https://github.com/openfaas/faas/blob/ac0fcc5f7125f93bfd9373faf2a1e652b80658a2/sample-functions/MarkdownRender/handler.go#L13-L16

知らなかった。コンテナ界では常識だったのかもしれない。

## dhello.go

package main

import ( "fmt" "io/ioutil" "os" )

func main() { input, _ := ioutil.ReadAll(os.Stdin) fmt.Printf("hello, %s", input) }

## dplus.go

package main

import ( "encoding/json" "fmt" "io/ioutil" "os" )

func main() { input, _ := ioutil.ReadAll(os.Stdin) var plus Plus if err := json.Unmarshal(input, &plus); err != nil { fmt.Println(err) os.Exit(1) } plus.Z = plus.X + plus.Y output, _ := json.Marshal(plus) fmt.Printf("%s", output) }

type Plus struct { X int Y int Z int }