Go Docker

Приложение Dockerize Go легко

3 примера с 3 разными результатами. . .

Есть несколько способов развернуть код Golang, особенно когда вы используете Docker для запуска исполняемого файла вашего проекта Go. Мы можем создать наш образ из нашего проекта, и мы можем просто запустить его на вашем локальном компьютере или даже при развертывании, вытащив ваш образ из реестра.

Требование

  • Докер
  • Основы программирования на Go

Репозиторий: https://github.com/david-yappeter/go-dockerfile-example

Начиная

Во-первых, вам нужно запустить демон Docker с помощью systemctl start docker или service docker start, при необходимости используйте sudo.

Затем мы создадим наш простой HTTP-код go.

$ mkdir go-dockerfile && cd go-dockerfile
$ go mod init myapp
$ touch server.go

server.go:

Наш server.go будет содержать простой маршрутизатор джин и дополнительный godotenv.

/ path вернет «Hello World», а /env path вернет «Hello $ {NAME}».

Dockerfile

есть несколько способов написать Dockerfile, но я сделаю 3 примера с разными базовыми изображениями: официальный голанг, альпийский и царапина.

С официального изображения

В этом Dockerfile мы разделим его на несколько разделов:

  • FROM golang:1.16-alpine, мы будем использовать golang:1.16-alpine в качестве базового образа этой сборки Docker.
  • WORKDIR, будет нашим рабочим каталогом нашей команды / путем наших следующих команд.
  • COPY go.* ./, мы скопируем файл go.mod & go.sum из нашего проекта в рабочий каталог.
  • RUN go mod download, скачайте зависимости проекта из модулей go.
  • COPY . ., скопируйте все из нашего проекта в рабочий каталог.
  • RUN go build -o /project/go-docker/build/myapp ., соберите наш проект в рабочем каталоге и выведите его в project/go-docker/build/myapp как двоичный файл.
  • EXPOSE 8080, сообщая докеру, что наш код откроет порт 8080.
  • ENTRYPOINT ["/project/go-docker/build/myapp"], когда мы запускаем контейнер этого образа, он запускается из нашего двоичного файла сборки.

Ни одно из этих повторяющихся объяснений не будет объяснено дважды. После этого нам нужно запустить эту команду:

docker build -f Dockerfile -t test-go-docker:latest .

-f флаг - это имя файла нашего Dockerfile.

-t flag - имя изображения позже.

. в конце команды - это каталог Dockerfile.

Попробуйте выполнить эту команду docker images, например:

Альпийская база

Отличие от первого:

  • FROM golang:1.16-alpine as builder, мы будем использовать golang:1.16-alpine и пометить его как builder, что будет использоваться позже.
  • FROM alpine:latest, мы создадим новый базовый образ из alpine.
  • COPY --from=builder /project/go-docker/build/myapp /project/go-docker/build/myapp, скопируйте двоичный файл сборки в новый образ alpine и запустите его позже.

Размер изображения этого Dockerfile намного меньше, чем у предыдущего изображения.

С нуля

И для последнего файла Dockerfile мы изменяем только базовый образ alpine на scratch. Scratch - это пустой образ, поэтому после запуска контейнера мы не можем выполнить его, потому что у него даже нет команды оболочки.

Выход docker images.

Изображение немного меньше, чем alpine базовое изображение.

попробуйте запустить образ с помощью docker run -d -p 8080:8080 test-go-docker:latest, он перенаправит порт 8080 из контейнера в наш 8080 порт и получит доступ к http://localhost:8080.

Выводы

Лично я выберу второй Dockerfile. Почему? потому что размер невелик, и в нем все еще есть несколько команд и команда оболочки, поэтому мы можем docker exec войти в контейнер и получить к нему доступ. Если мы будем использовать scratch базовый образ, нам будет сложно отлаживать наш работающий контейнер, потому что мы не можем выполнить его.

На этом вся статья о Docker с программированием на Go, желаю вам хорошего дня :).