Dockerfile с плагинами Go - PullRequest
       14

Dockerfile с плагинами Go

1 голос
/ 07 марта 2019

У меня есть Dockerfile, который создает образ для нашего проекта. Настраиваю все правильно, но я ищу лучший способ построить образ контейнера, потому что у нас есть больше плагинов, которые определяют поведение нашего проекта.

Итак, есть основной двоичный файл и ~ 10 плагинов, и я могу использовать 1 или более для моего двоичного файла Go. В настоящее время эти плагины в основном находятся в том же репозитории, что и основной проект, но в будущем будут другие плагины в разных репозиториях.

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

Что у меня сейчас есть:

FROM golang:alpine AS builder

RUN apk update && apk add --no-cache build-base

# Create appuser.
RUN adduser -D -g '' project-user

WORKDIR $GOPATH/src/bitbucket.org/company/project
COPY . .

RUN GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o /go/bin/project

# Minimal version of image
FROM scratch

COPY --from=builder /etc/passwd /etc/passwd
COPY --from=builder /go/bin/project /go/bin/project

USER project-user
EXPOSE 7676

ENTRYPOINT ["/go/bin/project"]

У него нет плагинов, поэтому он не запустится должным образом, потому что для бинарного файла требуется как минимум один плагин, но есть флаг plugins, ожидающий плагинов типа plugin.so или plugin1.so;plugin2.so;...

Как я уже говорил, есть несколько плагинов, и сейчас у нас есть сборщики RPM, которые собирают бинарный файл и все плагины отдельно, и мы делаем yum install project plugin1 plugin2 и в файле конфигурации (поскольку флаги также могут считываться из конфигурации). ) добавляем плагины.

Мы хотим изменить на Kubernetes , поэтому я ищу это решение в Dockerfile.

1 Ответ

0 голосов
/ 07 марта 2019

Итак, во-первых, я вижу некоторые проблемы с вашим Dockerfile, я могу их решить только потому, что не до конца понимаю ваши проблемы с плагинами.

  1. Это плохоИдея скопировать /etc/passwd подобным образом, вы можете избежать такого подхода, но вам придется скопировать все соответствующие файлы для пользователей и групп, например, cp /etc/{passwd,shadow,group,gshadow}, а затем обязательно исправить разрешения.Вам безопаснее просто создать пользователя только в конечном изображении, вы даже не используете его в сборщике, и размер контекста незначителен, если вы к этому стремитесь, запустив adduser в конструкторе.

  2. Если ваша go программа вызывает код C, то вам нужно будет основывать ваше окончательное изображение на чем-то отличном от scratch, поскольку у него нет необходимых библиотек.Вам нужно базовое изображение с некоторым вариантом libc, самый легкий - musl, и вы получите это с alpine изображениями.Если ваша go программа не вызывает код C, тогда вы можете использовать флаг CGO_ENABLED=0 во время go build, и тогда ваша встроенная бинарная программа не будет зависеть от чего-либо, поэтому вы можете использовать scratch или busybox базовых изображения.Вы можете найти больше информации о cgo здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...