标签: multiarch

重新标记多架构 docker 镜像

我正在寻找一种以不同名称重新标记现有图像的方法(例如,我们发布版本 xyz,我们latests也想标记 is)。目前我会这样做:

docker pull docker/my-app:123
docker tag docker/my-app:123 docker/my-app:latest
docker push docker/my-app:latest
Run Code Online (Sandbox Code Playgroud)

它适用于常规图像,但它会破坏多架构图像,并且仅标记/推送我当前计算机的架构。我知道我可以latest向 buildx 添加标签(它允许多个--tag参数),但我们也有这样的情况:我们有nightly构建,并且为了(测试)部署目的,我们用更多静态标签(大多数时候带有日期)来标记它们,并在这种情况下buildx多标签方法会中断。

(我知道有几个类似的问题,但它们是关于标记图像并推送到不同的存储库,并且经常建议使用 github.com/regclient/regclient 作为解决方案)

docker multiarch

13
推荐指数
1
解决办法
3056
查看次数

在 ARM 上构建 X86 docker 镜像?

我已经在构建.NET Core 应用程序的ARM设备上设置了构建管道。构建管道的最后一步是将编译的 .NET Core 应用程序存储在 docker 映像中。

是否可以将应用程序存储在X86的 .NET Core 运行时映像中?

我希望 .NET Core 应用程序不关心系统架构,只要部署了 .NET 框架。而且那个 docker 不需要启动 X86 镜像来生成新镜像:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1

COPY /my-application/build/ /app/

EXPOSE 80/tcp

WORKDIR /app
ENTRYPOINT ["dotnet", "app.dll"]
Run Code Online (Sandbox Code Playgroud)

docker .net-core asp.net-core multiarch

8
推荐指数
1
解决办法
4429
查看次数

创建清单时如何修复来自 Docker Hub 的“拒绝:请求访问资源被拒绝”错误

我正在尝试为我的 docker hub 存储库创建一个清单,以便我拥有一个多平台映像。

我的程序如下:

  1. 我首先创建一个空的存储库并向其中推送两个图像,一个用于 amd64,另一个用于 arm64。这些图像可以在这里预览: https //hub.docker.com/repository/docker/shadash/docker-multiarch-glusterfs-plugin
  2. 我使用 CLI 登录到我的 docker hub 帐户。我尝试了以下方法,响应是“登录成功”:
docker login --username=shadash
docker login docker.io --username=shadash
docker login https://index.docker.io/v1 --username=shadash
docker login
Run Code Online (Sandbox Code Playgroud)
  1. 我尝试创建一个清单:
docker manifest create shadash/docker-multiarch-glusterfs-plugin:latest shadash/docker-multiarch-glusterfs-plugin:x86_64 shadash/docker-multiarch-glusterfs-plugin:aarch64
Run Code Online (Sandbox Code Playgroud)

结果是:

错误:拒绝:请求的资源访问被拒绝未经授权:需要身份验证

  1. 我尝试使用清单工具(https://github.com/estesp/manifest-tool
git clone https://github.com/estesp/manifest-tool
cd manifest-tool
make
./manifest-tool push from-spec someimage.yaml
Run Code Online (Sandbox Code Playgroud)

someimage.yaml:

image: shadash/docker-multiarch-glusterfs-plugin:latest
manifests:
  - image: shadash/docker-multiarch-glusterfs-plugin:x86_64
    platform:
      architecture: amd64
      os: linux
  - image: shadash/docker-multiarch-glusterfs-plugin:aarch64
    platform:
      architecture: arm64
      os: linux
Run Code Online (Sandbox Code Playgroud)

结果:

FATA[0001] 检查图像“shadash/docker-multiarch-glusterfs-plugin:x86_64”失败,错误:错误:被拒绝:对资源的请求访问被拒绝未经授权:需要身份验证

因此,问题似乎与检查我现有的图像有关。但是,我可以很好地下载和安装这些插件(在 3 台不同的机器上测试过),并且当我启动使用此卷驱动程序的堆栈时,它们也可以正常工作:

docker plugin install …
Run Code Online (Sandbox Code Playgroud)

plugins manifest docker multiarch

6
推荐指数
1
解决办法
3322
查看次数

由于“未满足的依赖项”,无法在 Ubuntu 上安装 SQL Server 命令行工具

成功安装Sql Server后,按照文档,无法在 Ubuntu 20.04 上安装SQL Server 命令行工具。努力导致以下命令和结果:

curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
Run Code Online (Sandbox Code Playgroud)

好的

curl https://packages.microsoft.com/config/ubuntu/18.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list
Run Code Online (Sandbox Code Playgroud)

deb [arch=amd64] https://packages.microsoft.com/ubuntu/18.04/prod仿生主

sudo apt-get update 
Run Code Online (Sandbox Code Playgroud)

命中:1 http://dl.google.com/linux/chrome/deb stable InRelease
获取:2 http://security.ubuntu.com/ubuntu focus-security InRelease [107 kB]
命中:3 http://x .archive.ubuntu.com/ubuntu focus InRelease
Hit:4 http://x.archive.ubuntu.com/ubuntu focus-updates InRelease
Hit:5 http://x.archive.ubuntu.com/ubuntu focus-backports InRelease
命中:6 ...包。微软。com/ubuntu/18.04/mssql-server-2019 仿生 InRelease
Hit:7 ... 包。微软。com/ubuntu/20.04/prod focus InRelease
Hit:8 ... 下载 . 哥德。组织发布
命中:9 ...包。微软。com/ubuntu/18.04/prod 仿生 InRelease Get:10 ... security . Ubuntu的。com/ubuntu …

sql sql-server ubuntu multiarch

6
推荐指数
1
解决办法
4302
查看次数

docker-compose 多拱

可以为多架构构建 Docker 镜像。这通常是通过为每个架构创建一个特定的映像来完成的,然后根据拉取映像的系统创建清单作为正确映像的代理。

那太棒了。

现在,使用docker-compose,也可以构建图像,但我没有看到根据体系结构构建图像的方法,因此对于多个体系结构具有单个 docker-compose 定义的唯一方法似乎是拥有将多架构映像推送到注册表并从那里拉取。

有没有人知道使用 docker-compose 构建步骤为正确的拱形构建本地图像的方法?

docker docker-compose multiarch

5
推荐指数
1
解决办法
903
查看次数

在 Dockerfile 中设置条件变量

我正在尝试使用预定义的TARGETARCHarg变量通过 buildkit 创建多架构 docker 映像。

我想做的是 - 我认为 - 类似 bash 变量间接的东西,但我知道这不受支持,并且我正在努力想出替代方案。

这是我所得到的:

FROM alpine:latest

# Buildkit should populate this on build with e.g. "arm64" or "amd64"
ARG TARGETARCH

# Set some temp variables via ARG... :/
ARG DOWNLOAD_amd64="x86_64"
ARG DOWNLOAD_arm64="aarch64"

ARG DOWNLOAD_URL="https://download.url/path/to/toolkit-${DOWNLOAD_amd64}"

# DOWNLOAD_URL must also be set in container as ENV var.
ENV DOWNLOAD_URL $DOWNLOAD_URL

RUN echo "Installing Toolkit" && \
    curl -sSL ${DOWNLOAD_URL} -o /tmp/toolkit-${DOWNLOAD_amd64}
Run Code Online (Sandbox Code Playgroud)

...这是一个伪代码,但希望说明我正在尝试做的事情:我想要将$DOWNLOAD_amd64or的值$DOWNLOAD_arm64放入$DOWNLOAD_URL,具体取决于$TARGETARCH设置的内容。 …

docker dockerfile multiarch

5
推荐指数
1
解决办法
5998
查看次数

使用 docker-compose 构建两个不同标记的 docker 镜像

我目前正在使用 Docker 和 K8s 部署 Java 应用程序。由于我使用的是 Raspberry Pi Kubernetes 集群,因此我想生成两个映像,一个用于 x86 平台,另一个用于 arm32v7(用于在 Raspberry 集群上进行测试)。目标是使用一个 Dockerfile 生成两个不同标记的 docker 镜像,并将生成的镜像推送到 Docker Hub。我使用以下 Dockerfile:

FROM openjdk:8-alpine as x86

RUN mkdir -p /usr/src/app
COPY project/generated/distributions/executable/launch.jar /usr/src/app
WORKDIR /usr/src/app
CMD java -jar launch.jar


FROM arm32v7/adoptopenjdk:8-jre-hotspot-bionic as arm32

RUN mkdir -p /usr/src/app
COPY project/generated/distributions/executable/launch.jar /usr/src/app
WORKDIR /usr/src/app
CMD java -jar launch.jar
Run Code Online (Sandbox Code Playgroud)

我的docker-compose.yml看起来像这样:

version: '3.7'
services: 
  x86:
    build:
      context: .
      dockerfile: Dockerfile
      target: project:x86_64
  arm32:
    build:
      context: .
      dockerfile: Dockerfile
      target: project:arm32
Run Code Online (Sandbox Code Playgroud)

使用 …

build docker docker-compose multiarch

4
推荐指数
1
解决办法
1659
查看次数

GitLab CI/CD:构建多架构 Docker 镜像

我想要一种在 GitLab 运行程序中构建多架构 Docker 映像的简单方法。简单地说,我的意思是我只需要在我的项目中添加一个 .gitlab-ci.yml 就可以了。

这是我写的 .gitlab-ci.yml。它使用 buildx 构建多架构镜像,然后将其推送到 GitLab 注册表:

image: cl00e9ment/buildx

services:
- name: docker:dind

variables:
  PLATFORMS: linux/amd64,linux/arm64
  TAG: latest

before_script:
  - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"

build:
  stage: build
  script:
  - docker buildx build --platform "$PLATFORMS" -t "${CI_REGISTRY_IMAGE}:${TAG}" . --push
Run Code Online (Sandbox Code Playgroud)

问题是linux/arm64平台不可用。

以下是我构建 cl00e9ment/buildx 映像的方法(强烈受到snadn/docker-buildx的启发):

这是 Dockerfile:

FROM docker:latest

ENV DOCKER_CLI_EXPERIMENTAL=enabled
ENV DOCKER_HOST=tcp://docker:2375/

RUN mkdir -p ~/.docker/cli-plugins \
  && wget -qO- https://api.github.com/repos/docker/buildx/releases/latest | grep "browser_download_url.*linux-amd64" | cut -d : -f 2,3 | …
Run Code Online (Sandbox Code Playgroud)

build gitlab docker gitlab-ci multiarch

4
推荐指数
2
解决办法
2145
查看次数

docker 清单创建注释并推入脚本

我有 DockerHub 为我的项目构建镜像x86_64。图像的命名如下:myname/project:version_architecture; 例如foo/bar:1.0.0_x86_64

然后我aarch64在 RPi4: 上构建映像foo/bar:1.0.0_aarch64,然后将其推送到 DockerHub。

现在我想要一个包含它们的清单,以便我可以foo/bar:1.0.0在任何地方使用它并且它可以工作。

AFAIK,以下命令应该有效(在 RPi 上运行):

docker build -t foo/bar:1.0.0_aarch64 .
docker push foo/bar:1.0.0_aarch64

docker manifest create foo/bar:1.0.0 foo/bar:1.0.0_aarch64
docker manifest annotate foo/bar:1.0.0 foo/bar:1.0.0_x86_64
docker manifest push foo/bar:1.0.0
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,该annotate步骤有时会失败:

manifest for image foo/bar:1.0.0_x86_64 does not exist in foo/bar:1.0.0
Run Code Online (Sandbox Code Playgroud)

以下解决方法(通常)可以代替:

docker build -t foo/bar:1.0.0_aarch64 .
docker push foo/bar:1.0.0_aarch64

docker manifest create foo/bar:1.0.0 foo/bar:1.0.0_aarch64
docker manifest annotate foo/bar:1.0.0 foo/bar:1.0.0_x86_64
docker manifest create …
Run Code Online (Sandbox Code Playgroud)

docker docker-registry multiarch

4
推荐指数
1
解决办法
6379
查看次数

ARM 映像的 Docker 构建失败

我尝试在 Travis-CI 上为多个架构构建一个 docker 镜像。这对于 amd64 和 i386 非常有效,但对于 ARM 却失败了。

在顶部的Dockerfile构建{ARCH}/nextcloud:apache是建立在顶部php:7.3-apache-stretch再次使用debian:stretch-slim。所以所有的图像都使用相同的堆栈并且应该做出相似的反应。

.travis.yml

env:
  - TAG=i386     ARCH=i386
  - TAG=amd64    ARCH=amd64
  - TAG=armhf    ARCH=arm32v7
  - TAG=aarch64  ARCH=arm64v8

before_script:
  - docker run --rm --privileged multiarch/qemu-user-static:register --reset

script:
  - docker build --pull --build-arg ARCH=$ARCH -t escoand/nextcloud:$TAG nextcloud
Run Code Online (Sandbox Code Playgroud)

文件

ARG ARCH

FROM ${ARCH}/nextcloud:apache

RUN apt-get update && apt-get install -y supervisor && \
    rm -rf /var/lib/apt/lists/* && \
    mkdir /var/log/supervisord /var/run/supervisord
Run Code Online (Sandbox Code Playgroud)

如前所述,i386 和 amd64 的构建没有问题。ARM 构建已通过第一个 RUN 命令失败: …

linux travis-ci docker multiarch

3
推荐指数
1
解决办法
1689
查看次数

有没有办法使用 docker manifest-list 在 ECR 中构建多架构镜像?

我正在尝试使用 Amazon ECR 来存储我的图像。

现在,我希望我的 image:tag 适用于不同的操作系统和架构,如 linux/amd64、linux/arm64、windows 等。

当我使用 docker 时这很好,但似乎我无法让它与 ECR 一起工作。

Docker 表示您可以将其推送到不安全的注册表:
https://docs.docker.com/engine/reference/commandline/manifest/

失败的命令:

docker buildx build --platform linux/amd64,linux/arm64 -t 5XXXXXXXXXX.dkr.ecr.ap-southeast-2.amazonaws.com/imagename:tag --push .
Run Code Online (Sandbox Code Playgroud)

此命令成功:

docker buildx build --platform linux/arm64 -t 5XXXXXXXXXX.dkr.ecr.ap-southeast-2.amazonaws.com/imagename:tag --push .
Run Code Online (Sandbox Code Playgroud)

多平台镜像可以推送到Docker Hub。


我想知道我们如何做到这一点。这是我的想法。如果我错了,请纠正我。

我们可以创建自己的清单文件,其中包含已放置在 ECR 存储库中的图像吗?

就像是:

image: image:multi-arch
manifests:
   -
      image: 5XXXXXXXXXX.dkr.ecr.ap-southeast-2.amazonaws.com/imagename:tag/i1-linuxamd64
      platform:
             architecture: arm64
      os: linux

   -
      image: 5XXXXXXXXXX.dkr.ecr.ap-southeast-2.amazonaws.com/imagename:tag/i2-intelx86
      platform:
             architecture: intelx86
      os: Windows
Run Code Online (Sandbox Code Playgroud)

现在我们有一个名为image:multi-arch的新图像。然后我们使用这个镜像并期望它能够根据清单自动获取目标架构。

如果我将最终图像推送到 ECR,它会起作用吗?难道我做错了什么?请随时纠正我。

amazon-web-services amazon-ecs docker amazon-ecr multiarch

2
推荐指数
1
解决办法
2178
查看次数