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