我正在寻找一种以不同名称重新标记现有图像的方法(例如,我们发布版本 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 作为解决方案)
我已经在构建.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 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)
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)
结果是:
错误:拒绝:请求的资源访问被拒绝未经授权:需要身份验证
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) 成功安装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 …
可以为多架构构建 Docker 镜像。这通常是通过为每个架构创建一个特定的映像来完成的,然后根据拉取映像的系统创建清单作为正确映像的代理。
那太棒了。
现在,使用docker-compose
,也可以构建图像,但我没有看到根据体系结构构建图像的方法,因此对于多个体系结构具有单个 docker-compose 定义的唯一方法似乎是拥有将多架构映像推送到注册表并从那里拉取。
有没有人知道使用 docker-compose 构建步骤为正确的拱形构建本地图像的方法?
我正在尝试使用预定义的TARGETARCH
arg变量通过 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_amd64
or的值$DOWNLOAD_arm64
放入$DOWNLOAD_URL
,具体取决于$TARGETARCH
设置的内容。 …
我目前正在使用 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)
使用 …
我想要一种在 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) 我有 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) 我尝试在 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 命令失败: …
我正在尝试使用 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,它会起作用吗?难道我做错了什么?请随时纠正我。
multiarch ×11
docker ×10
build ×2
.net-core ×1
amazon-ecr ×1
amazon-ecs ×1
asp.net-core ×1
dockerfile ×1
gitlab ×1
gitlab-ci ×1
linux ×1
manifest ×1
plugins ×1
sql ×1
sql-server ×1
travis-ci ×1
ubuntu ×1