有一种众所周知的方法可以将 Docker 镜像从一个容器注册表复制到另一个容器注册表。如果原始注册表是 dockerhub,典型的工作流程将如下所示:
docker pull <image:tag>
docker tag <image:tag> <new-reg-url/uid/image:tag>
docker push <new-reg-url/uid/image:tag>
Run Code Online (Sandbox Code Playgroud)
现在,在处理具有多架构层的图像时,您如何执行上述操作?
根据此链接中的信息,您可以依靠buildx构建多架构图像,并且在执行此操作时,您还可以将它们上传到您想要的任何存储库,但是我如何在不必首先构建图像的情况下执行此操作?
看起来buildxcli 不必要地(?)将上传过程与构建过程耦合在一起。有什么建议么?
谢谢!
在 Github Actions 上,当我将新构建的 Docker 镜像放在缓存中时,我希望避免从注册表中提取该镜像(这是我工作中最慢的部分)
我的工作流程是这样的
根据Docker Build Push Action 文档,设置cache-to和cache-from指向gha有助于加快步骤 1 的速度。
然而,当我跑步时docker run ghcr.io/org/image:new-tag command,它总是以
Unable to find image 'ghcr.io/org/image:new-tag' locally
new-tag: Pulling from org/image
...
5402d6c1eb0a: Pulling fs layer
...
Run Code Online (Sandbox Code Playgroud)
这大约需要 50 秒(总作业时间约为 75 秒)。
当存在包含此信息的缓存时,这似乎是不必要的,但是我不知道如何告诉我的docker run命令如何使用此缓存,因为据我所知,--cache-from=ghadocker run 没有等效的选项。
当我在 Github Actions 上调用 docker run 时,如何告诉 docker 在 gha 缓存中查找图像?
以下命令不显示输出ubuntu1图像:
docker buildx build -f 1.dockerfile -t ubuntu1 .
docker image ls | grep ubuntu1
# no output
Run Code Online (Sandbox Code Playgroud)
1.docker文件:
FROM ubuntu:latest
RUN echo "my ubuntu"
Run Code Online (Sandbox Code Playgroud)
另外,我无法在其他 docker 文件的语句中使用该图像FROM(两个版本都在我的本地 Windows 机器上):
2.docker文件:
FROM ubuntu1
RUN echo "my ubuntu 2"
Run Code Online (Sandbox Code Playgroud)
docker buildx build -f 2.dockerfile -t ubuntu2 .
#error:
WARNING: No output specified for docker-container driver. Build result will only remain in the build cache. To push result image into registry use --push or to load image into …Run Code Online (Sandbox Code Playgroud) 我正在为在不同架构上运行的 docker 容器构建镜像。由于我无法始终访问互联网,因此我通常只是在有互联网的情况下拉取映像,并且 docker 使用本地映像而不是拉取新映像。当我开始使用 buildx 构建映像后,这似乎不再起作用了。有没有办法告诉docker只使用本地镜像?当我有连接时,docker 似乎会检查是否有可用的新版本,但使用本地(或缓存)图像,正如我期望的那样,无需互联网连接。
$ docker image ls
ros galactic bac817d14f26 5 weeks ago 626MB
Run Code Online (Sandbox Code Playgroud)
$ docker image inspect ros:galactic
...
"Architecture": "arm64",
"Variant": "v8",
"Os": "linux",
...
Run Code Online (Sandbox Code Playgroud)
构建命令示例
$ docker buildx build . --platform linux/arm64
WARN[0000] No output specified for docker-container driver. Build result will only remain in the build cache. To push result image into registry use --push or to load image into docker use --load
[+] Building 0.3s (3/3) FINISHED
=> [internal] load …Run Code Online (Sandbox Code Playgroud) 据我所知docker buildx build --push将用您在--platform参数中指定的图像架构覆盖现有的图像架构。据我了解,在使用buildx. 但是,我知道官方 docker 镜像使用arm64构建农场来构建linux/arm64镜像。这怎么可能?他们只是使用docker pushwithout吗buildx?如果是这样,是否意味着docker push不会覆盖现有架构buildx?如果我想在不同的机器上构建和推送多个架构,最好的方法是什么?
据我了解:
我能收集到的差异:
我不清楚的是两组工具之间的重叠程度以及何时应该使用其中一个而不是另一个。例如,这两个工具似乎都很好地涵盖了在 Kubernetes 集群上自托管远程映像构建场的用例。
当我尝试像往常一样使用 Docker 进行 Docker 构建时,我在映像中收到错误消息,并且无法构建。这种情况我该怎么办?顺便说一句,Docker的版本是23.0.1。( https://i.stack.imgur.com/AzgNi.png )( https://i.stack.imgur.com/PIryk.png ) ( https://i.stack.imgur.com/kMF5Y.png)
当我卸载 docker buildx 然后 Build 时,我收到其他警告错误,并且 Build 本身可以工作,但无法执行并行处理。我的理想是使用 Buildx 进行并行构建。
在 Macbook M2 机器上,我在创建 docker 构建时遇到错误。
这是可以重现错误的最简单的示例:
echo "FROM alpine:latest" | docker build --platform=linux/amd64 --progress=plain -f - .
Run Code Online (Sandbox Code Playgroud)
注意最后一行的错误:
#5 ERROR: no match for platform in manifest sha256:d9ab3e9e8a65da61fb54c3e2471c8fabf787ce49403919bff7eaf10f99e33215: not found
------
> exporting to image:
------
ERROR: failed to solve: no match for platform in manifest sha256:d9ab3e9e8a65da61fb54c3e2471c8fabf787ce49403919bff7eaf10f99e33215: not found
Run Code Online (Sandbox Code Playgroud)
#1 [internal] load .dockerignore
#1 transferring context: 2B done
#1 DONE 0.0s
#2 [internal] load build definition from Dockerfile
#2 transferring dockerfile: 93B done
#2 DONE 0.0s
#3 [internal] …Run Code Online (Sandbox Code Playgroud) 我正在运行一个 Jenkins Alpine Linux AMD64docker 映像,该映像是我自己构建的,并希望linux/arm64为其添加 docker buildx 支持,以便生成多平台映像,但我不知道它应该如何工作。
当我检查支持的平台时,我得到:
+ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
default * docker
default default running linux/amd64, linux/386
Run Code Online (Sandbox Code Playgroud)
因为我在 AMD64 映像中。我读到我需要为此安装 qemu,但我不知道 buildx 如何识别它。
该文档对此相对简单: https: //docs.docker.com/buildx/working-with-buildx/
有人知道如何在 linux/amd64 映像中添加 linux/arm64 构建功能吗?
我现在看到的唯一解决方案是在实际的 arm64 系统上构建映像。
要求:应用程序必须容器化为 docker 镜像,并且需要支持arm64和amd64架构。
代码库:它是一个 golang 应用程序,需要使用git2go库,并且必须CGO_ENABLED=1构建项目。最小的可重现示例可以在 github 上找到。
主机:我使用 arm64 M1 mac 和 docker 桌面来构建应用程序,但结果在我们的 amd64 Jenkins CI 构建系统上类似。
Dockerfile:
FROM golang:1.17.6-alpine3.15 as builder
WORKDIR /workspace
COPY go.mod go.mod
COPY go.sum go.sum
RUN apk add --no-cache libgit2 libgit2-dev git gcc g++ pkgconfig
RUN go mod download
COPY main.go main.go
ARG TARGETARCH TARGETOS
RUN CGO_ENABLED=1 GO111MODULE=on GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -tags static,system_libgit2 -a -o gitoperations main.go
FROM …Run Code Online (Sandbox Code Playgroud) buildx ×10
docker ×10
caching ×1
cgo ×1
containers ×1
docker-build ×1
gcc ×1
go ×1
kaniko ×1
wsl-2 ×1