我使用--sshdocker buildkit 功能,它在本地运行良好。我想在远程服务器上构建 Docker,为此我使用该-A标志来转发我的本地 github 密钥,例如:
ssh -i "server.pem" -A <user>@<server-ip>
Run Code Online (Sandbox Code Playgroud)
然后在服务器终端我运行:
ssh -T git@github.com
Run Code Online (Sandbox Code Playgroud)
我收到“Hello user”消息,这意味着密钥转发工作正常。
(在服务器中,$SSH_AUTH_SOCK确实设置了,我可以git clone)
现在,在本地构建时,我使用:
DOCKER_BUILDKIT=1 docker build --ssh default=~/.ssh/id_rsa -t myimage:latest .
Run Code Online (Sandbox Code Playgroud)
哪个工作正常。
但是在服务器中,私钥在 ~/.ssh/id_rsa 中不存在。那么如何将其转发到 docker build 呢?在服务器上试过这个:
DOCKER_BUILDKIT=1 docker build --ssh default=$SSH_AUTH_SOCK -t myimage:latest .
Run Code Online (Sandbox Code Playgroud)
但它不起作用。错误是:
could not parse ssh: [default]: invalid empty ssh agent socket, make sure SSH_AUTH_SOCK is set
Run Code Online (Sandbox Code Playgroud)
即使SSH_AUTH_SOCK设置
Docker 版本:19.03
假设我正在使用 Docker Buildkit 构建镜像。我的图像来自多阶段 Dockerfile,如下所示:
FROM node:12 AS some-expensive-base-image
...
FROM some-expensive-base-image AS my-app
...
Run Code Online (Sandbox Code Playgroud)
我现在正在尝试构建这两个图像。假设我将这些推送到 Docker Hub。some-expensive-base-image:latest如果我要使用 Docker Buildkit 的外部缓存功能,那么我会希望在构建目标时通过拉入远程映像作为缓存来尝试节省 CI 管道上的构建时间some-expensive-base-image。而且,我想拉入刚刚构建的some-expensive-base-image图像和远程my-app:latest图像作为后一个图像的缓存。我相信我需要两者,以防止需要some-expensive-base-image重建的步骤,因为……嗯……它们很昂贵。
这就是我的构建脚本的样子:
FROM node:12 AS some-expensive-base-image
...
FROM some-expensive-base-image AS my-app
...
Run Code Online (Sandbox Code Playgroud)
我的问题:参数的顺序--cache-from对第二个重要吗docker build?
对于此构建,我的 CI 管道得到的结果不一致。即使没有任何可能导致缓存破坏的代码更改,在构建后一个映像时也会发生缓存未命中的情况。Cache Minefest 可以毫无问题地拉取。有时会拉取缓存映像,但有时需要重新运行后一个目标的所有步骤。我不知道为什么。
碰巧,我应该在运行脚本中的命令docker pull之前尝试使用两个图像吗?docker build
另外,我知道我在示例中提到了 Docker Hub,但在现实生活中,我的应用程序使用 AWS ECR 作为其远程 Docker 存储库。这对于正确的 Buildkit 功能有影响吗?
我正在使用 buildx 进行多架构 Docker 构建。
基础映像python:3.8.5-alpine具有linux/arm64/v8其操作系统/体系结构之一,但生成的映像 ( corralpeltzer/newtrackon) 缺少变体,从而在其清单中/v8创建了一个映像。linux/arm64
我对这种差异感到困惑。会产生兼容性问题吗?我应该尝试强制使用变体docker manifest annotate吗?
有关更多详细信息,这是在GitHub 操作中运行的。这是 buildx 命令的一部分:
buildx build --platform linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8
Run Code Online (Sandbox Code Playgroud)
这个问题似乎来自于 buildx 构建器可用的拱门:
/usr/bin/docker buildx inspect --bootstrap
#1 [internal] booting buildkit
#1 pulling image moby/buildkit:buildx-stable-1
#1 pulling image moby/buildkit:buildx-stable-1 1.6s done
#1 creating container buildx_buildkit_builder-4bebce7d838a55e24aa111384fec8c97144df7290
#1 creating container buildx_buildkit_builder-4bebce7d838a55e24aa111384fec8c97144df7290 1.7s done
#1 DONE 3.3s
Name: builder-4bebce7d838a55e24aa111384fec8c97144df729
Driver: docker-container
Nodes:
Name: builder-4bebce7d838a55e24aa111384fec8c97144df7290
Endpoint: unix:///var/run/docker.sock
Status: running
Platforms: linux/amd64, linux/arm64, …Run Code Online (Sandbox Code Playgroud) 有人声称,在拉取镜像后可以提取 Docker 镜像的构建参数(示例)。
我已经使用以下 Dockerfile 对此进行了测试:
FROM scratch
ARG SECRET
ADD Dockerfile .
Run Code Online (Sandbox Code Playgroud)
当我构建图像时:
$ docker build -t build-args-test --build-arg SECRET=12345 .
Run Code Online (Sandbox Code Playgroud)
并按照文章中指定的方式检查它:
$ docker image history --no-trunc build-args-test
IMAGE CREATED CREATED BY SIZE COMMENT
sha256:(hash omitted) 17 minutes ago ADD Dockerfile . # buildkit 43B buildkit.dockerfile.v0
<missing> 17 minutes ago ARG SECRET 0B buildkit.dockerfile.v0
Run Code Online (Sandbox Code Playgroud)
我看不到实际的构建参数 ( 12345)。
有没有办法从图像中提取构建参数?
如果图像不是在我的机器上构建而是从存储库中提取的,答案会有所不同吗?
我知道Docker 构建秘密功能。但是,我具体询问的是ARG.
我的组织使用 http/https 代理。到互联网的流量必须通过此代理路由。
我们正在为构建和推送 docker 镜像的 jenkins 管道添加多架构支持。HTTP_PROXY 和 HTTPS_PROXY 环境变量是为 docker 设置的,适用于常规 docker 构建,但是当尝试使用该命令构建多个体系结构时docker buildx build,我看到以下错误
无法解决:rpc 错误:代码 = 未知 desc = amazoncorretto:11:无法执行请求:头“https://registry-1.docker.io/v2/library/amazoncorretto/manifests/11”:拨打 tcp 44.207。 96.114:443:I/O 超时
它在本地工作。我确信这是因为流量不是通过代理路由的。我尝试通过 driver-opt 和 build-arg 设置它。
我正在使用 Build Toolkit 为每个微服务构建 docker 映像。
./build.sh
export DOCKER_BUILDKIT=1
# ....
docker build -t ....
# ...
Run Code Online (Sandbox Code Playgroud)
这可以在我的机器上使用 docker (18.09.2) 运行。
但是,它不适用于 Jenkins,我设置如下:
EKS 配置有 Terraform 模块
module "eks" {
source = "terraform-aws-modules/eks/aws"
version = "5.0.0"
# ....
}
Run Code Online (Sandbox Code Playgroud)Jenkins通过此Helm Chart部署在 EKS( v1.12.10-eks-ffbd9, ) 上。docker://18.6.1
Jenkins 插件在 helm 版本的值中定义:
Jenkins Pipeline 是声明式的,它使用 Pod 模板,其中容器映像为docker:18-dind,容器名称为dind。
这是我的 Jenkins 文件
pipeline {
agent {
kubernetes {
defaultContainer 'jnlp' …Run Code Online (Sandbox Code Playgroud)这是我的代码的片段:
stage('tf run') {
agent {
dockerfile {
additionalBuildArgs "${ADDITIONAL_BUILD_ARGS}"
registryCredentialsId "${REGISTRY_CREDENTIALS}"
registryUrl "${REGISTRY_URL}"
reuseNode true
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想在运行这段代码时添加特殊变量 DOCKER_BUILDKIT=1 。例如,在 shell 中,它应该如下所示:“DOCKER_BUILDKIT=1 docker build ”。我需要它,因为我想在 docker_buildkit 模式下运行我的 docker。我怎样才能做到这一点?
当使用 buildkit、使用 docker cli 前端时,我有时不想使用层缓存,但确实想依赖较新的挂载缓存类型。
RUN --mount=type=cache,target=...
Run Code Online (Sandbox Code Playgroud)
然而,跑步docker build --no-cache似乎会禁用两者。
有没有一种方法可以选择在重建期间仅使用安装缓存?
我有一个 docker 容器,有时我想使用buildkit构建它,有时使用标准 docker build 构建它。想象一下我们有一个像这样的容器:
# syntax=docker/dockerfile:experimental
FROM python:3.8
# Install all necessary libraries into a pyenv environment
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts
RUN --mount=type=ssh pip install -r api-requirements.txt
Run Code Online (Sandbox Code Playgroud)
当我们从我们的私有存储库 pip 安装东西时,我们使用该--mount=type=ssh标志告诉 buildkit 使用 ssh 密钥。当您使用 Buildkit 通过以下命令进行构建时,一切正常:
ssh-add && cd api && DOCKER_BUILDKIT=1 docker build --no-cache --ssh default -t image-name .
Run Code Online (Sandbox Code Playgroud)
但是,我们无法再使用标准 docker 命令构建此容器,例如:
docker build -t image-name .
Run Code Online (Sandbox Code Playgroud)
因为该--mount标志不被识别。无论如何,是否可以使用相同的 Dockerfile,而无需使用 buildkit 和正常方式对其进行编辑?可以告诉 Docker 忽略这些标志吗?
我正在努力解决加文在这个问题上提到的同样问题 。
使用该功能的正确方法是什么?
在互联网上环顾四周,我只在上面提到的 docker 文档中发现了同一示例的一些变体,它在构建时打印了秘密。也许我没有完全理解这个例子,所以请帮助我。
如果无法在构建时获取机密并在 Dockerfile 的其他部分(例如 ARG 变量或 RUN 命令)中使用,那么何时以及如何使用该新功能来真正保证我的机密安全并完成工作?
我的目标是在构建时使用这个新功能,并保证我的秘密信息的安全,以防有人获取我的图像文件并在其上执行历史记录。
例如,我有一个像这样的 Dockerfile:
FROM influxdb:2.0
ENV DOCKER_INFLUXDB_INIT_MODE=setup
ENV DOCKER_INFLUXDB_INIT_USERNAME=admin
ENV DOCKER_INFLUXDB_INIT_PASSWORD="mypassword"
Run Code Online (Sandbox Code Playgroud)
例如,如何使用 docker 文档中提到的新功能来设置我的变量 (DOCKER_INFLUXDB_INIT_PASSWORD),使其不会记录在图像历史记录中?
提前致谢
docker-buildkit ×10
docker ×9
docker-build ×2
jenkins ×2
buildx ×1
caching ×1
dockerfile ×1
kubernetes ×1
ssh ×1
ssh-keys ×1
terraform ×1