скажи это прямо
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 /