Всех приветствую!
Интересует мнение общества по поводу сборки проекта через docker где поставлять надо конкретно исполняемый "файл", а не в виде пуша образа в докер репозиторий.
Возник рабочий момент с двумя мнениями.
Описано немного утрировано, что-то опущено.
1 вариант. Собирать проект внутри контейнера, предварительно скопировав исходники в образ. Примерно так:
FROM golang...
...установка mingw-w64, сертификатов и тд...
COPY go.mod go.sum ./
RUN go mod download
COPY . .
VOLUME ["/builded"]
RUN go build -o /builded/... cmd/*.go
Собирать
docker run --rm ..skip.. -v "....:/builded" myimage
Плюсы: так "принято", везде подобные примеры.
Минусы: думаю что надо регулярно чистить ненужные множащиеся образы, тк зависимости иногда меняются, а исходники всегда. В других Го проектах образы будут расти начиная с зависимостей.
2 вариант. Собирать проект снаружи, но конейнером - сборщиком. Примерно так
FROM golang...
...установка mingw-w64, сертификатов и тд...
VOLUME [ "/project" ]
VOLUME [ "/go/pkg" ]
WORKDIR /project
Собирать
docker run --rm ..skip.. -v "$(CURDIR):/project" -v "$(GOPATH)/pkg:/go/pkg" myimage go mod download && go build -o builded/... cmd/*.go
Минусы: в этом варианте возникла проблема что gitlab не может удалить созданные каталоги/файлы тк владелец их root. Победить через USER или --user и их сочетания пока не привели к успеху.
Плюсы: исходники не копируются, образ будет один и не будет меняться от сборки к сборке. В других проектах будет использоваться этот же образ.
Я склоняюсь ко второму варианту, но меня склоняют к первому :)
Поделитесь опытом. Может я что-то упустил или еще не узнал?