Docker Build (二):构建上下文

22 篇文章 0 订阅
11 篇文章 0 订阅

更多文章: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无法获取任何上下文文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值