Como criar seu Docker Container para trabalhar com Go

Como criar seu Docker Container para trabalhar com Go

Publicado em: 20/4/2016

Uma das maneiras que gosto de trabalhar é utilizando Docker. Simplesmente por conseguir igualar o ambiente de desenvolvimento de todo um time, sem depender que cada um faça a configuração manualmente em sua máquina, ou seja, apenas uma pessoa precisa configurar o ambiente no container.

No último post falei um pouco sobre a linguagem Go. Então, nesse post vou mostrar passo a passo como montei uma imagem para começar o meu primeiro projeto em Go.

1. Escolha do Sistema Operacional

A primeira coisa a fazer é escolher o S.O. do seu container. No caso, tenho maior familiaridade com sistemas baseado em Debian, então no Dockerfile iniciamos com “FROM ubuntu:18.04”, que é a versão LTS do Ubuntu.

Para instalarmos o Go, precisamos de alguns pacotes do ubuntu (entre eles o curl e o wget para baixarmos algumas dependências que não estão no pacote do S.O.), pacotes que vão auxiliar no desenvolvimento como git e o vim e/ou alguns pacotes para o build do pacote em Go. Para isso, vamos colocar no Dockerfile assim:

RUN apt-get update && \
apt-get install -y \
build-essential \
curl \
gcc \
git \
gnupg \
libc6-dev \
wget \
vim

2. Instalação do Go

Após instalar essas dependências, vamos começar a instalar o Go. Primeiro vamos configurar as variáveis de ambiente para a instalação do Go setando as seguintes envs:

ENV GO_INSTALL_DIR="/usr/local/"
ENV PATH=$PATH:$GO_INSTALL_DIR/go/bin
ENV GOPATH="/workspace"
ENV GOBIN="/usr/local/go/bin"

Depois de setar as variáveis, vamos fazer o download do Go 1.11.1. Para deixar a versão do Go configurada, basta colocá-la em uma env. Feito isso, mudamos a pasta descompactada do Go para a pasta local, usando a env “GO_INSTALL_DIR” que setamos no passo anterior.

ENV GOLANG_VERSION 1.11.1
RUN wget “https://dl.google.com/go/go${GOLANG_VERSION}.linux-amd64.tar.gz”
RUN tar zxvf “go${GOLANG_VERSION}.linux-amd64.tar.gz” -C $GO_INSTALL_DIR

Após isso o Go está pronto para uso.

3. Configuração do projeto

Chegou a hora de configurar nosso projeto. Para isso, criaremos uma variável de ambiente onde ficará da pasta do projeto. Criar a pasta, setá-la como pasta de trabalho e copiar os arquivos do projeto para o container, usando os comandos:

ENV APP_HOME /workspace/src/project
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME

ADD . $APP_HOME

No meu projeto, achei legal usar o dep, que é um gerenciador de dependências do Go, assim como o Composer no PHP e o Bundler do Ruby. Vamos baixar o dep com o curl e depois rodar o comando para baixar as dependências do projeto. Para isso, usaremos o comando:

RUN curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
RUN dep ensure -v

Após isso, basta expor a porta que você quer usar no seu container. Por padrão ostumo expor a 8080, usando o comando:

EXPOSE 8080

Feito isso, seu Dockerfile deve ter ficado exatamente assim

FROM ubuntu:18.04

RUN apt-get update && \
apt-get install -y \
build-essential \
curl \
gcc \
git \
gnupg \
libc6-dev \
wget \
vim

ENV GO_INSTALL_DIR="/usr/local/"
ENV PATH=$PATH:$GO_INSTALL_DIR/go/bin
ENV GOPATH="/workspace"
ENV GOBIN="/usr/local/go/bin"

RUN wget https://dl.google.com/go/go1.11.1.linux-amd64.tar.gz
RUN tar zxvf go1.11.1.linux-amd64.tar.gz -C $GO_INSTALL_DIR

RUN curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
RUN dep ensure -v

ENV APP_HOME /workspace/src/project
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME

ADD . $APP_HOME

EXPOSE 8080

Com essa imagem, você já é capaz de rodar seu projeto em Go dentro do Docker sem precisar instalar e configurar nada além do Docker em sua máquina local. Desta forma, o ambiente de desenvolvimento de todo o seu time estará configurado de maneira igual para todos.

4. Vídeo tutorial

Caso fique alguma dúvida, você pode assistir o vídeo que gravei montando essa mesma imagem e baixar o Dockerfile nesse github. Você também pode usar a imagem oficial do Go disponibilizada no Docker Hub.

Tem alguma dúvida, sugestão ou quer saber algo mais sobre Docker ou Go? Deixe um comentário!

Publicado originalmente em Blog Locaweb