Back-End

16 jul, 2018

Usando gofn para subir containers docker e rodar Clojure e Python

Publicidade

Como carregar containers Docker usando gofn

Primeiro instanciamos a struct BuildOptions que vai informar para o gofn os detalhes do container,  como o nome da imagem, por exemplo.

buildOpts := &provision.BuildOptions{
	ImageName: "nome da imagem aqui",
	StdIN:     "o que você quer passar no stdin para o container aqui",
	DoNotUsePrefixImageName: true,
}

Depois instanciamos as opções do container, por exemplo, se você quer passar variáveis de ambiente.

containerOpts := &provision.ContainerOptions{}

É uma boa pratica criar um contexto e definir um timeout para ele. No nosso caso, definimos um timeout de cinco segundos. Se o seu container não retornar nesse tempo, o gofn se encarrega de matar ele.

ctx, cancelFunc := context.WithTimeout(
	context.Background(),
	time.Duration(5)*time.Second)

Então rodamos o gofn passando nossas opções e pegamos o retorno de stdin, stdout e error, caso exista.

stdout, stderr, err = gofn.Run(ctx, buildOpts, containerOpts)

Por fim, como criamos uma função cancel devido ao nosso contexto de timeout, sempre temos que chamar a função cancel no final.

cancelFunc()

O container

É bem simples fazer containers docker para usar com gofn. Basicamente tudo que você faz com um container normal vai funcionar. Geralmente preferimos mandar e receber informações via stdin, sdtout e stderr porque é uma forma simples e fácil de modificar.

Esse é um exemplo bem simples usando Clojure:

(ns runner.core
  (:gen-class))

(defn upper []
  (print (clojure.string/upper-case (slurp *in*)))
  (flush))

(defn -main []
  (upper))

E agora um exemplo usando Python:

import sys
import json
import base64

d = json.load(sys.stdin)
d["encoded"] = base64.b64encode(d["phrase"].encode('utf-8')).decode('utf-8')
json.dump(d, sys.stdout, ensure_ascii=False)

Links mencionados, alguns foram mencionados fora da gravação:

Nossos encontros ocorrem todas as quintas-feiras às 22h00. Para participar, entre no canal de Go no Slack e procure por #brazil.