Как эффективно восстановить проект go при использовании Docker Compose?
Это может быть глупый вопрос, но я новичок в использовании Docker-compose. До сих пор я люблю это... но у меня есть некоторые долгие времена сборки. У меня есть проект с несколькими зависимостями, и мне нужно явно перестраивать исходный код каждый раз, когда я делаю изменения. Щас звоню docker-compose build
восстановить контейнер, а затем docker-compose up
, Проблема в:
Он перестраивает весь контейнер для каждого изменения, которое я делаю в исходном коде (что занимает много времени - получение зависимостей и т. Д.). Это значительно замедляет меня.
Я действительно чувствую, что должен просто выполнить команду на контейнере, чтобы перестроить, а затем повторно запустить исполняемый файл, вот так:
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
Используя многоэтапные сборки, вы используете тяжелый образ для сборки приложения и еще один действительно маленький для запуска приложения.