Docker y Golang Como reducir tus contenedores
imagen tomada del Blog Whomeninja
Creare este post del blog de Nick Gauthier que esta en ingles, pero fue de donde yo lo aprendi a usar y después ya realice mis adecuaciones ya que en este momento solo les mostrare como realizarlo con código pequeño de Go, ya que después yo realice uno en el cual se levantaba una sitio web con js, css, html y de mas!
Primero tendremos un poco de código que estaremos usando
package main
import (
"fmt"
"io/ioutil"
"net/http"
"os"
)
func main() {
resp, err := http.Get("https://google.com")
check(err)
body, err := ioutil.ReadAll(resp.Body)
check(err)
fmt.Println(len(body))
}
func check(err error) {
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}
Por ejemplo, aquí podríamos utilizar su imagen FROM golang:latest que contiene todo pero esto puede generar una imagen de mas de 500 mb donde nuestra app es solo de 5.8MB entonces estamos cargando nuestro contenedor lo cual puede provocar mas cargos en nuestro servicio de host entre otras cosas mas, pero entonces, que podemos hacer, veamos...
Primero que haremos algo con multi pasos, es decir, primero crearemos el ejecutable de la siguiente manera.
go build -o main .
docker build -t example-scratch -f Dockerfile.scratch .
Ahora crearemos una pequeña imagen de la siguiente manera.
FROM scratch
ADD main /
CMD ["/main"]
Recordemos que Scratch es solo una imagen que se usa de base y pesa 0MB
Con esto logramos tener una imagen con el programa main de Go que fue construido previamente con un peso de 5.8 MB aproximadamente. Entonces simplemente corremos el contenedor, pero un momento que es lo que paso...
$ docker run -it example-scratch
no such file or directory
Entonces lo que tenemos que hacer es cambiar la forma en la que hacemos el Build de nuestro código de Go de la siguiente manera.
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
Volvemos a crear el contenedor y ya con esto podrá correr sin problemas, y sera de un peso aproimado a los 6MB lo cual es mucho mejor que un contenedor de 500MB no lo creen!?
En mi ejemplo yo no manejo SSL como lo hace en el blog de Nick, así que se los dejare de tarea ir a ver la configuración que realizo el y saber como manejo el los certificados, este es el problema que deben de resolver, les encargo se den un momento para analizar y darle una solución (aunque ya les diga como en la pagina, nunca es tan fácil)
$ docker run -it example-scratch
Get https://google.com: x509: failed to load system roots and no roots provided
Espero estén haciendo todos sus tareas y continúen aprendiendo, espero sus comentarios y le agradeceré sus votos!!
Now go and code around!
Saludos!
Excelente, Go + Docker en español. Se agradece el esfuerzo.
gracias! igual este como ya se tenia solo fue basicamente uan traduccion el siguiente procupare darles el repositorio que puedan descargarlo y ejecutarlo para que vean como funciona si quieren crear una imagen pequeña por ejemplo con un sitio estatico y asi es mas versatil, saludos!
exelente