Доберизировать серии (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»