Docker многоступенчатая сборка - исключить. git папка - PullRequest
0 голосов
/ 31 января 2020

Я хочу сделать docker многоэтапную сборку, но нажмите / игнорируйте папку. git, чтобы сэкономить место на изображении docker.

FROM ubuntu as first
WORKDIR /app
RUN git clone <repo>

FROM golang as second
WORKDIR app
COPY --from=first /app .

, если есть, - - исключить опцию для копирования? Вот связанная проблема: https://forums.docker.com/t/dockerignore-in-multi-stage-builds/57169

другая возможность - удалить папку. git вручную:

FROM ubuntu as first
WORKDIR /app
RUN git clone <repo>
RUN rm -rf .git

Я предполагаю, что многоэтапная сборка копирует «последний слой» с другого этапа?

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Я понял, что эта техника, которую я использовал в ОП, просто не будет работать. Большинству людей понадобится папка. git, чтобы оформить правильный коммит. Весь смысл клонирования всего репо заключался в кешировании, чтобы мы могли получить желаемый коммит позже в следующий раз, когда мы сделаем сборку.

Итак, вместо того, чтобы делать то, что я пытался сделать в OP, один Техника, которую я использовал в прошлом, чтобы получить хорошее кэширование и создавать небольшие изображения, была примерно такой:

WORKDIR /app
ADD  's3://url/to/just/package.json' /app/package.json
RUN npm install --production

ARG commit_id
RUN aws s3 cp -c . 's3://url/to/whole/tarball'

, поэтому вы можете кэшировать зависимости, если пакет. json не изменился, и когда вы делаете сборку, что вам пу sh, тощий tarball для s3 с TTL, а затем система сборки может вытянуть tarball к образу. У tarball нет папки git, и он может исключать кучу других файлов по желанию, которые обычно отслеживаются системой контроля версий.

1 голос
/ 31 января 2020

Один из способов исключить файлы из сборки - использовать файл .dockerignore . Тем не менее, это, вероятно, не то, что вам нужно, поскольку вы используете git клон во время подготовки образа, так что вам действительно понадобится папка .git.

Если вы ' Я хотел бы использовать многоступенчатую сборку, тогда вам нужно будет скопировать артефакты , а не слои от предыдущей сборки к следующей.

Другая идея - запустить поверхностную сборку. клон - git clone --depth=1 - это должно значительно уменьшить размер хранилища.

...