Спецификации и методы Dockerfile

Docker

скажи это прямо

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

Продолжайте исследовать, вы найдетеDockerfileНа самом деле есть некоторыеобрати внимание наДа, сегодня я поделюсьDockerfileНекоторые правила и приемы в.

мы начинаем сdocker buildДля ознакомления один за другим

docker build

docker buildкоманда отDockerfileфайлы и контекстcontextвстраиватьimage.

  • создать контекстcontextэто путь к указанному местоположениюpathилиURLСерия файлов под
  • дорожкаpathэто каталог в локальной файловой системе. URL-адрес — это расположение репозитория Git.
  • создать контекстcontextбудет обрабатываться рекурсивно, путьpathВключить все подпути под ним
  • URLСодержит соответствующий репозиторий и все подмодули

Простая команда сборки использует текущий каталог в качестве контекста.context

docker build .

Путь к Dockerfile

DockerfileПо умолчанию он помещается в корневой путь кода ибез суффикса

.dockerignore

Корневой путь кода должен иметь.dockerignoreфайл и.dockerignoreсодержимое файла должно быть проигнорировано.gitкаталог, примеры следующие:

# comment
.git
*/temp*
*/*/temp*
temp?
*.md
!README.md
Rule Behavior
# comment Примечания
/temp например /somedir/temporary.txt
//temp* например, /somedir/subdir/temporary.txt
temp? например темпа, темпб
*.md !README.md Все файлы md, кроме README.md

Дополнительные правила см.Официальная документация по докеру

Трюк с Dockerfile

в корневом каталоге кодаDockerfileПосле этого черезdocker build -f Dockerfile .Образ можно построить, и образ должен содержать продукт сборки, поэтому он должен находиться вDockerfileШаг компиляции и упаковки добавлен в Dockerfile.Этот шаг используется только для компиляции и упаковки и не повлияет на многослойность окончательной конструкции образа, поэтому в Dockerfile необходимо использоватьНесколько инструкций FROMПуть.

  • несколькоFromСмысл команды:

несколькоFROMИнструкция состоит в том, чтобы не генерировать многоуровневую взаимосвязь слоев, и последнее сгенерированное изображение по-прежнему основано на последнем.FROMпреобладать, передFROMбудет заброшен, то предыдущийFROMВ чем смысл?

каждыйFROMИнструкции представляют собой этап сборки, несколькоFROMЭто многоступенчатая конструкция.Хотя окончательное сгенерированное изображение может быть только результатом последней стадии, файлы с предыдущей стадии могут быть скопированы на последующую стадию, что является самым важным значением многоступенчатой ​​конструкции.

Самый большой вариант использованияОтделение среды сборки от среды выполнения, например, до того, как нам нужно было построитьGoязыковая программа, то вам нужно использоватьgoкоманда и другая среда компиляции, нашаDockerfileЭто может выглядеть так:

# Go语言环境基础镜像
FROM golang:1.10.3

# 将源码拷贝到镜像中
COPY server.go /build/

# 指定工作目录
WORKDIR /build

# 编译镜像时,运行 go build 编译生成 server 程序
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GOARM=6 go build -ldflags '-w -s' -o server

# 指定容器运行时入口程序 server
ENTRYPOINT ["/build/server"]

базовое изображениеgolang:1.10.3огромен, потому что он содержит всеGoИнструменты и библиотеки компиляции языка, а во время выполнения нам нужны только скомпилированныеserverПрограмма подойдет, и инструменты компиляции во время компиляции не нужны, а получившийся крупномасштабный образ - пустая трата времени.

Новое решение, этап компиляции и этап выполнения находятся непосредственно в одномDockerfileЭто может быть решено:

# 编译阶段
FROM golang:1.10.3

COPY server.go /build/

WORKDIR /build

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GOARM=6 go build -ldflags '-w -s' -o server

# 运行阶段
FROM scratch

# 从编译阶段的中拷贝编译结果到当前镜像中
COPY --from=0 /build/server /

ENTRYPOINT ["/server"]

этоDockerfileизТайнаэтоCOPYДиректива--from=0параметр, копировать файлы из предыдущего этапа в текущий этап, несколькоFROMоператор, 0 представляет первую стадию. Вместо использования номеров вы также можете назвать этапы, например:

# 编译阶段 命名为 builder
FROM golang:1.10.3 as builder

# ... 省略

# 运行阶段
FROM scratch

# 从编译阶段的中拷贝编译结果到当前镜像中
COPY --from=builder /build/server /