{"id":26840,"date":"2018-12-18T15:32:02","date_gmt":"2018-12-18T15:32:02","guid":{"rendered":"https:\/\/devlooper.blog.br\/\/?p=571"},"modified":"2018-12-18T15:32:02","modified_gmt":"2018-12-18T15:32:02","slug":"como-criar-seu-docker-container-para-trabalhar-com-go","status":"publish","type":"post","link":"https:\/\/www.locaweb.com.br\/blog\/temas\/codigo-aberto\/como-criar-seu-docker-container-para-trabalhar-com-go\/","title":{"rendered":"Como criar seu Docker Container para trabalhar com Go"},"content":{"rendered":"<p>Uma das maneiras que gosto de trabalhar \u00e9 utilizando Docker. Simplesmente por conseguir igualar o ambiente de desenvolvimento de todo um time, sem depender que cada um fa\u00e7a a configura\u00e7\u00e3o manualmente em sua m\u00e1quina, ou seja, apenas uma pessoa precisa configurar o ambiente no container.<\/p>\n<p>No \u00faltimo post falei um pouco sobre a linguagem Go. Ent\u00e3o, nesse post vou mostrar passo a passo como montei uma imagem para come\u00e7ar o meu primeiro projeto em Go.<\/p>\n<h2>1. Escolha do Sistema Operacional<\/h2>\n<p>A primeira coisa a fazer \u00e9 escolher o S.O. do seu container. No caso, tenho maior familiaridade com sistemas baseado em Debian, ent\u00e3o no Dockerfile iniciamos com \u201cFROM ubuntu:18.04\u201d, que \u00e9 a vers\u00e3o LTS do Ubuntu.<\/p>\n<p>Para instalarmos o Go, precisamos de alguns pacotes do ubuntu (entre eles o curl e o wget para baixarmos algumas depend\u00eancias que n\u00e3o est\u00e3o no pacote do S.O.), pacotes que v\u00e3o 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:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-theme=\"atomic\">RUN apt-get update &amp;&amp; \\\napt-get install -y \\\nbuild-essential \\\ncurl \\\ngcc \\\ngit \\\ngnupg \\\nlibc6-dev \\\nwget \\\nvim<\/pre>\n<h2>2. Instala\u00e7\u00e3o do Go<\/h2>\n<p>Ap\u00f3s instalar essas depend\u00eancias, vamos come\u00e7ar a instalar o Go. Primeiro vamos configurar as vari\u00e1veis de ambiente para a instala\u00e7\u00e3o do Go setando as seguintes envs:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-theme=\"atomic\">ENV GO_INSTALL_DIR=\"\/usr\/local\/\"\nENV PATH=$PATH:$GO_INSTALL_DIR\/go\/bin\nENV GOPATH=\"\/workspace\"\nENV GOBIN=\"\/usr\/local\/go\/bin\"<\/pre>\n<p>Depois de setar as vari\u00e1veis, vamos fazer o download do Go 1.11.1. Para deixar a vers\u00e3o do Go configurada, basta coloc\u00e1-la em uma env. Feito isso, mudamos a pasta descompactada do Go para a pasta local, usando a env \u201cGO_INSTALL_DIR\u201d que setamos no passo anterior.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-theme=\"atomic\">ENV GOLANG_VERSION 1.11.1\nRUN wget \u201chttps:\/\/dl.google.com\/go\/go${GOLANG_VERSION}.linux-amd64.tar.gz\u201d\nRUN tar zxvf \u201cgo${GOLANG_VERSION}.linux-amd64.tar.gz\u201d -C $GO_INSTALL_DIR<\/pre>\n<p>Ap\u00f3s isso o Go est\u00e1 pronto para uso.<\/p>\n<h2>3. Configura\u00e7\u00e3o do projeto<\/h2>\n<p>Chegou a hora de configurar nosso projeto. Para isso, criaremos uma vari\u00e1vel de ambiente onde ficar\u00e1 da pasta do projeto. Criar a pasta, set\u00e1-la como pasta de trabalho e copiar os arquivos do projeto para o container, usando os comandos:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-theme=\"atomic\">ENV APP_HOME \/workspace\/src\/project\nRUN mkdir -p $APP_HOME\nWORKDIR $APP_HOME\n\nADD . $APP_HOME<\/pre>\n<p>No meu projeto, achei legal usar o dep, que \u00e9 um gerenciador de depend\u00eancias 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\u00eancias do projeto. Para isso, usaremos o comando:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-theme=\"atomic\">RUN curl https:\/\/raw.githubusercontent.com\/golang\/dep\/master\/install.sh | sh\nRUN dep ensure -v<\/pre>\n<p>Ap\u00f3s isso, basta expor a porta que voc\u00ea quer usar no seu container. Por padr\u00e3o ostumo expor a 8080, usando o comando:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-theme=\"atomic\">EXPOSE 8080<\/pre>\n<p>Feito isso, seu Dockerfile deve ter ficado exatamente assim<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-theme=\"atomic\">FROM ubuntu:18.04\n\nRUN apt-get update &amp;&amp; \\\napt-get install -y \\\nbuild-essential \\\ncurl \\\ngcc \\\ngit \\\ngnupg \\\nlibc6-dev \\\nwget \\\nvim\n\nENV GO_INSTALL_DIR=\"\/usr\/local\/\"\nENV PATH=$PATH:$GO_INSTALL_DIR\/go\/bin\nENV GOPATH=\"\/workspace\"\nENV GOBIN=\"\/usr\/local\/go\/bin\"\n\nRUN wget https:\/\/dl.google.com\/go\/go1.11.1.linux-amd64.tar.gz\nRUN tar zxvf go1.11.1.linux-amd64.tar.gz -C $GO_INSTALL_DIR\n\nRUN curl https:\/\/raw.githubusercontent.com\/golang\/dep\/master\/install.sh | sh\nRUN dep ensure -v\n\nENV APP_HOME \/workspace\/src\/project\nRUN mkdir -p $APP_HOME\nWORKDIR $APP_HOME\n\nADD . $APP_HOME\n\nEXPOSE 8080<\/pre>\n<p>Com essa imagem, voc\u00ea j\u00e1 \u00e9 capaz de rodar seu projeto em Go dentro do Docker sem precisar instalar e configurar nada al\u00e9m do Docker em sua m\u00e1quina local. Desta forma, o ambiente de desenvolvimento de todo o seu time estar\u00e1 configurado de maneira igual para todos.<\/p>\n<h2>4. V\u00eddeo tutorial<\/h2>\n<p>Caso fique alguma d\u00favida, voc\u00ea pode assistir o v\u00eddeo que gravei montando essa mesma imagem e baixar o Dockerfile nesse github. Voc\u00ea tamb\u00e9m pode usar a imagem oficial do Go disponibilizada no Docker Hub.<\/p>\n<p>Tem alguma d\u00favida, sugest\u00e3o ou quer saber algo mais sobre Docker ou Go? Deixe um coment\u00e1rio!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uma das maneiras que gosto de trabalhar \u00e9 utilizando Docker. Simplesmente por conseguir igualar o ambiente de desenvolvimento de todo um time, sem depender que cada um fa\u00e7a a configura\u00e7\u00e3o manualmente em sua m\u00e1quina, ou seja, apenas uma pessoa precisa configurar o ambiente no container. No \u00faltimo post falei um pouco sobre a linguagem Go. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":33270,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[5],"tags":[],"class_list":["post-26840","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-aberto"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/posts\/26840","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/comments?post=26840"}],"version-history":[{"count":0,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/posts\/26840\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/media\/33270"}],"wp:attachment":[{"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/media?parent=26840"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/categories?post=26840"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/tags?post=26840"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}