更多文章:WorkMap技术博客
docker build或docker buildx build命令从Dockerfile和“上下文”构建Docker镜像。
构建上下文是传递给构建命令的参数:
docker build [OPTIONS] PATH | URL | -
什么是构建上下文?
- 本地目录的相对或绝对路径
- 远程 Git仓库、tarball或纯文本文件
- 使用标准输入的管道纯文本文件或tarball
文件系统作为上下文
当构建上下文是本地目录、远程Git存储库或tar文件时,那该文件集就是Builder在构建期间可以访问的文件集。构建指令可以引用上下文中的任何文件和目录。
- 指定本地目录或tarball时,所有子目录都包括在内。
- 指定远程Git存储库时,存储库和所有子模块都包括在内。
文本文件作为上下文
当构建上下文是纯文本文件时,Builder会认为该文件是Dockerfile。这种情况下,Builder没有可访问的文件系统。
使用本地目录或者tarball作为上下文
-
使用当前目录(.)作为构建上下文的构建命令:
docker build . 16 [ internal] load build context 16 sha256:23ca2f94460dcbaf5b3c3edbaaa933281a4e0ea3d92fe295193e4df44dc68f85 16 transferring context: 13.16MB 2.2s done
则Docker Builder可以访问当前工作目录中的文件和目录。Builder在需要时从上下文中加载所需的文件。
例如,给定以下目录结构:. ├── index.ts ├── src/ ├── Dockerfile ├── package.json └── package-lock.json
Dockerfile指令可以引用这些文件进行构建。
# syntax=docker/dockerfile:1 FROM node:latest WORKDIR /src COPY package.json package-lock.json . RUN npm ci COPY index.ts src .
.dockerignore
可以使用 .dockerignore 文件来排除某些文件或目录不被发送:
# .dockerignore node_modules bar
使用代码仓库作为上下文
将Git 仓库的 URL 作为参数传递给 docker build 时,Builder将使用该仓库作为构建上下文。Builder下载 HEAD 提交,不会下载整个历史记录。构建器递归克隆仓库及其包含的任何子模块。
docker build https://github.com/user/myrepo.git
默认情况下,Builder克隆仓库默认分支上的最新提交。
- 指定分支和子目录(格式#ref:dir)
ref 是分支、标签或远程引用的名称
dir 是存储库内的子目录
以下命令使用 container 分支和该分支中的 docker 子目录作为构建上下文:
docker build https://github.com/user/myrepo.git#container:docker
更多使用示例
-
myrepo.git
对应的commit :refs/heads/
构建上下文:/ -
myrepo.git#mytag
对应的commit :refs/tags/mytag
构建上下文:/ -
myrepo.git#mybranch
对应的commit :refs/heads/mybranch
构建上下文:/ -
myrepo.git#pull/42/head
对应的commit :refs/pull/42/head
构建上下文:/ -
myrepo.git#:myfolder
对应的commit :refs/heads/
构建上下文:/myfolder -
myrepo.git#master:myfolder
对应的commit :refs/heads/master
构建上下文:/myfolder -
myrepo.git#mytag:myfolder
对应的commit :refs/tags/mytag
构建上下文:/myfolder -
myrepo.git#mybranch:myfolder
对应的commit :refs/heads/mybranch
构建上下文:/myfolder
保留 .git 目录
默认情况下,当使用 Git 上下文时,BuildKit 不会保留 .git 目录。可以通过设置 BUILDKIT_CONTEXT_KEEP_GIT_DIR 构建参数来配置 BuildKit 以保留该目录。
docker build \
--build-arg BUILDKIT_CONTEXT_KEEP_GIT_DIR=1
https://github.com/user/myrepo.git#main
私有仓库
使用私有git仓库作为上下文时,构建器需要身份验证凭据。
- 通过ssh
docker buildx build --ssh default git@github.com:user/private.git
- 通过token
GIT_AUTH_TOKEN=<token> docker buildx build \ --secret id=GIT_AUTH_TOKEN \ https://github.com/user/private.git
远程tarballs
docker build http://server/context.tar.gz
#1 [internal] load remote build context
#1 DONE 0.2s
#2 copy /context /
#2 DONE 0.1s
...
使用管道
将纯文本或者tarballs文件发送给Builder上下文
docker build - < Dockerfile
docker build - < archive.tar
docker build - <<EOF
FROM node:alpine
COPY . .
RUN npm ci
EOF
只发送纯文本
docker build - < Dockerfile
这种情况下,Builder无法获取任何上下文文件。