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 }