Slide 52 de 53

Contêineres

Escrevendo, e rodando o que foi escrito
$ hive container main.hive
Wrote Dockerfile for main.hive (0s)
$ docker build -t main .
$ docker run --rm -p 8080:8080 main
O que ele escreve
# syntax=docker/dockerfile:1
#
# Builds and runs main.hive, from nothing but this folder.
#
#   docker build -t main .
#   docker run --rm -p 8080:8080 main

##############################################################################
# Stage 1 — download Go and the compiler, then build
##############################################################################
FROM debian:bookworm-slim AS builder

# What Docker is building for: amd64 on an ordinary machine, arm64 on an
# Apple-silicon one or a Graviton.
ARG TARGETARCH

# ... Go itself, then the compiler's latest release for that architecture ...

WORKDIR /app

# The whole folder, because a program is its entrypoint and whatever that
# imported. A .dockerignore is what narrows this.
COPY . .

RUN hivec build /app/main.hive \
 && test -x /app/main

##############################################################################
# Stage 2 — runtime
##############################################################################
FROM gcr.io/distroless/static-debian12 AS runtime
WORKDIR /app
COPY --from=builder /app/main /usr/local/bin/main

# 8080 is where this program serves: hive.net.httpServe(8080, ...) says so.
EXPOSE 8080

ENTRYPOINT ["/usr/local/bin/main"]
`hive container entrypoint.hive` escreve um Dockerfile para o programa, na pasta em que o comando foi rodado — que é também o contexto do build. Nada precisa estar instalado para construir a imagem além do próprio Docker: o primeiro estágio baixa o Go e o último lançamento do compilador para a plataforma para a qual se está construindo — amd64 numa máquina comum, arm64 numa de silício Apple, então o build é nativo de qualquer jeito — e compila o programa com os dois. O segundo estágio é o executável e nada mais, sobre distroless/static: sem Go, sem compilador, nem sequer um shell.As partes do arquivo que não são um template são lidas do programa em vez de adivinhadas. Um hive.net.httpServe(8080, ...) vira um EXPOSE 8080 que diz num comentário de onde o número veio; um import que nomeia um repositório coloca git no estágio de build, já que o compilador o clona enquanto a imagem é construída; um programa que abre um banco de dados diz por que go mod tidy roda antes de qualquer coisa ser compilada. Tudo que está ao lado do Dockerfile entra no build, então um .dockerignore é o que estreita isso.O que sai é um Dockerfile comum, e editá-lo é esperado. Um Dockerfile que já esteja na pasta nunca é sobrescrito — o nosso se chama Dockerfile-hive-container em vez disso, e o comando diz qual dos dois escreveu. Este tour é servido a partir de uma imagem construída exatamente assim.