Рубрики
Uncategorized

Докерейте свое приложение Go

Go быстро становится одним из моих любимых языков для работы. Итак, сегодня мы придерживаемся наше … Помечено с Go, Docker, DevOps.

Доберизировать серии (5 части серии)

Go быстро становится одним из моих любимых языков для работы. Итак, сегодня мы связываем наше приложение Go Go, воспользовавшись рисунком Builder и Multistage Builds, чтобы уменьшить наше изображение Docker из 850 МБ просто 15 МБ Действительно

Эта статья является частью серии Dockerize, обязательно проверить то Вступление Куда я пройду несколько концепций, которые мы собираемся использовать. Код из этой статьи доступен здесь

Я также сделал видео, если вы хотели бы следовать вдоль

Настройка проекта

Я инициализировал простое API, используя Мэрс

├── main.go
├── go.mod
└── go.sum

Вот наш Main.go.

package main

import (
    "encoding/json"
    "log"
    "net/http"

    "github.com/gorilla/mux"
)

func main() {
    router := mux.NewRouter()
    router.HandleFunc("/", func(rw http.ResponseWriter, r *http.Request) {
        response := map[string]string{
            "message": "Hello Docker!",
        }
        json.NewEncoder(rw).Encode(response)
    })

    log.Println("Server is running!")
    http.ListenAndServe(":4000", router)
}

Для разработки

Мы будем использовать Рефлекс как часть нашего рабочего процесса развития. Если вы не знакомы, Reflex обеспечивает живую перезагрузку при разработке.

Давайте продолжим нашу настройку Docker, добавив Dockerfile

FROM golang:1.16.5 as development
# Add a work directory
WORKDIR /app
# Cache and install dependencies
COPY go.mod go.sum ./
RUN go mod download
# Copy app files
COPY . .
# Install Reflex for development
RUN go install github.com/cespare/reflex@latest
# Expose port
EXPOSE 4000
# Start app
CMD reflex -g '*.go' go run api.go --start-service

Давайте создадим Docker-Compose.yml Отказ Здесь мы также смонтим наш код в объем Так что мы можем синхронизировать наши изменения с контейнером при разработке.

version: "3.8"

services:
  app:
    container_name: app-dev
    image: app-dev
    build:
      context: .
      target: development
    volumes:
      - .:/app
    ports:
      - 4000:4000

Начинать! Начинать! Начинать!

docker-compose up

Мы также можем использовать -d Флаг, чтобы запустить в режиме демона

Отлично, наш сервер Dev is up!

app-dev  | Starting service...
app-dev  | 2021/07/04 12:50:06 Server is running!

Давайте проверим наш образ, используя Docker Images команда

REPOSITORY          TAG                   IMAGE ID       CREATED         SIZE
app-dev             latest                3063740d56d8   7 minutes ago   872MB

Над 850 МБ Для Hello World! Хотя это может быть в порядке для развития, но для производства давайте посмотрим, как мы можем уменьшить наш размер изображения

Для производства

Давайте обновим наше Dockerfile Добавляя строитель и Производство сцена

Обновление: обратите внимание, как мы определяем Cgo_enabled 0. с участием Env. в Dockerfile а не делать прямо раньше Go Build. команда. Кроме того, мы будем использовать альпийский вместо того царапать Как это действительно трудно отлаживать контейнеры в производстве с царапать

FROM golang:1.16.5 as builder
# Define build env
ENV GOOS linux
ENV CGO_ENABLED 0
# Add a work directory
WORKDIR /app
# Cache and install dependencies
COPY go.mod go.sum ./
RUN go mod download
# Copy app files
COPY . .
# Build app
RUN go build -o app

FROM alpine:3.14 as production
# Add certificates
RUN apk add --no-cache ca-certificates
# Copy built binary from builder
COPY --from=builder app .
# Expose port
EXPOSE 4000
# Exec built binary
CMD ./app

Давайте добавим сборку Наше производственное изображение

docker build -t app-prod . --target production

Давайте проверим наш построенный производственный образ

docker images

Использование Builder Pattern Мы сократили размер изображения для просто ~ 15 МБ !

REPOSITORY                    TAG                   IMAGE ID       CREATED          SIZE
app-prod                      latest                ed84a3896251   50 seconds ago   14.7MB

Начнем наш производственный контейнер на порту 80

docker run -p 80:4000 --name app-prod app-prod

Мы также можем добавить Makefile Чтобы сделать наш рабочий процесс проще

dev:
  docker-compose up

build:
  docker build -t app-prod . --target production

start:
  docker run -p 80:4000 --name app-prod app-prod 

Следующие шаги

С этим мы должны иметь возможность воспользоваться Docker в нашем рабочим процессе и развернуть наши производственные изображения быстрее на любую платформу нашего выбора.

Не стесняйтесь добраться до меня на Twitter Если вы сталкиваетесь с любыми проблемами.

Доберизировать серии (5 части серии)

Оригинал: «https://dev.to/karanpratapsingh/dockerize-your-go-app-46pp»