Dev (Back & Front)ARTIGO

Usando gofn para subir containers docker e rodar Clojure e Python

O autor mostra como usar o gofn para carregar containers Docker e se comunicar com eles e apresenta três containers rodando com gofn: dois em Python e um em Clojure.

Usando gofn para subir containers docker e rodar Clojure e Python
Imagem: Cesar Gimenes

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.

Cesar GimenesAutor

Trabalha com tecnologia desde a década de 90. Já atuou na área de educação e participou de projetos de mobilidade de grande volume para laboratórios farmacêuticos. Criou games tanto para PC, como para iOS. Hoje está direcionando seus esforços em plataformas de Sistemas Embarcados, IoT, microservices e cloud computing. É um entusiasta de tecnologias como Golang e Docker.

Ver perfil