Как эффективно восстановить проект go при использовании Docker Compose?

Это может быть глупый вопрос, но я новичок в использовании Docker-compose. До сих пор я люблю это... но у меня есть некоторые долгие времена сборки. У меня есть проект с несколькими зависимостями, и мне нужно явно перестраивать исходный код каждый раз, когда я делаю изменения. Щас звоню docker-compose build восстановить контейнер, а затем docker-compose up, Проблема в:

  1. Он перестраивает весь контейнер для каждого изменения, которое я делаю в исходном коде (что занимает много времени - получение зависимостей и т. Д.). Это значительно замедляет меня.

  2. Я действительно чувствую, что должен просто выполнить команду на контейнере, чтобы перестроить, а затем повторно запустить исполняемый файл, вот так:

    docker-compose запустить web go build.
    docker-compose запустить web./app 
    или же
    docker-compose запустить web go build.
    docker-compose restart
    
    Это должно работать, потому что я использую том для совместного использования кода между хостом и контейнером. Не должно быть необходимости перевыпускать все зависимости. Разве он не должен использовать только что созданный исполняемый файл? Однако это не отражает встроенные изменения, и переадресация портов, по-видимому, прерывается.

Для справки, вот мой Dockerfile:

FROM golang:1.8

COPY . /go/src/github.com/codeblooded/test1
WORKDIR /go/src/github.com/codeblooded/test1

RUN echo $PATH
RUN go get -d -v ./...
RUN go install -v ./...

RUN go build -o test1 .
CMD ["test1"]
EXPOSE 3470

И мой файл docker-compose.yml:

version: '3'
services:
  postgres:
    image: postgres
    volumes:
      - ./db/data/psql:/var/lib/postgresql/data
      - ./db/schema:/db/schema
  redis:
    image: redis
    volumes:
      - ./db/data/redis:/data
  server:
    build: .
    command: test1
    volumes:
      - .:/go/src/github.com/codeblooded/test1
    ports:
      - "3470:3470"
    depends_on:
      - postgres
      - redis

Я что-то упускаю?

2 ответа

Решение

Вы задали хороший вопрос.

Порядок команды в Dockerfile действительно имеет значение. Сначала поместите вещи, которые не меняются часто, а затем те, которые наиболее вероятно изменятся в каждой сборке:

FROM golang:1.8

RUN go get -d -v ./...
RUN go install -v ./...

COPY . /go/src/github.com/codeblooded/test1
WORKDIR /go/src/github.com/codeblooded/test1

RUN echo $PATH

RUN go build -o test1 .
CMD ["test1"]
EXPOSE 3470

Когда слой изменяется относительно предыдущей сборки, Docker отбрасывает следующие кэшированные слои и запускает их снова, иногда тратя ваше время.

Обратите внимание на предложение "Использование кэша", которое выводится Docker на каждом слое, который повторно используется из предыдущей сборки.

Еще одна рекомендация для вашей работы с разработчиками: используйте fresh, чтобы автоматически перестраивать приложение go каждый раз, когда вы меняете код. Просто установите его в контейнер и просто используя command: fresh в вашем docker-compose.yml

И если вы хотите улучшить свой Docker, вы можете сделать изображение меньшего размера. Я предлагаю "многоэтапные сборки", чтобы сделать это

Размер изображения для этой сборки составляет около 600 МБ

FROM golang:1.8

RUN go get -d -v ./...
RUN go install -v ./...

COPY . /go/src/github.com/codeblooded/test1
WORKDIR /go/src/github.com/codeblooded/test1

RUN echo $PATH

RUN go build -o test1 .
CMD ["test1"]
EXPOSE 3470

При использовании многоступенчатых сборок вес изображения равен размеру двоичного файла и царапины

FROM golang:1.8 as builder

RUN go get -d -v ./...
RUN go install -v ./...

COPY . /go/src/github.com/codeblooded/test1

WORKDIR /go/src/github.com/codeblooded/test1

RUN echo $PATH
RUN CGO_ENABLED=0 GOOS=linux go build -o test1 .


FROM alpine:latest

RUN apk --no-cache add ca-certificates

WORKDIR /go/src/github.com/codeblooded/

COPY --from=builder /go/src/github.com/codeblooded/test1 .

CMD ["test1"]

EXPOSE 3470

Используя многоэтапные сборки, вы используете тяжелый образ для сборки приложения и еще один действительно маленький для запуска приложения.

Другие вопросы по тегам