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 dockerDocker46 conteúdosE o Docker Swarm? Contextos e motivadores diáriosDevSecOps · ago 2024Automatizando o ambiente de desenvolvimento e testes com DockerDevSecOps · mai 2019MySQL + Adminer + Docker Compose: montando rapidamente um ambiente para usoData · abr 2019Ver tudo em DevSecOps 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 PythonPython56 conteúdosVSCode + Python + Alexa: Desenvolva e teste skills para alexa localmente com pythonDev (Back & Front) · out 2025Dominando decoradores em Python: um guia completo com exemplosDev (Back & Front) · jan 2025Desenvolvimento de software: diferenças entre Python, JavaScript e JavaGestão Dev & TI · nov 2024Ver tudo em Dev (Back & Front) :

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.

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