首页 > 其他分享 >docker 跨平台构建镜像

docker 跨平台构建镜像

时间:2023-11-10 16:02:19浏览次数:33  
标签:8080 -- 注册表 buildx 跨平台 linux 镜像 docker

我们在开发环境构建的镜像在生产环境大多不可用,我们在开发中一般使用 Windows 或者 MAC 系统,部署多半是 linux 环境。那么这篇文章能帮到你。

首先

首先你需要有一个 Dockerfile 文件。

举例:这里以一个 python 项目举例

FROM python:3.10-slim

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD [ "python", "bin/run.py" ]

docker 跨平台构建镜像_bash

构建环境

前置环境设置,创建了一个 mybuilder 环境,

docker buildx create --name mybuilder --bootstrap --use

查看支持的环境

docker buildx ls

docker 跨平台构建镜像_linux_02

上传镜像的你的 repo,这里举例上传到 阿里云的 repo:

编译打包上传

docker buildx build --platform linux/amd64 --tag registry.cn-beijing.aliyuncs.com/xxx/xxx:heloworldjavapub --push  .

进阶

以上是一个简单的案例,接下来适合高阶玩家

Buildx是对 Docker 工具的一个很好的补充。我认为它是“完整的 BuildKit”。出于我们的目的,它可以指定同时构建多个平台并将它们全部打包为多平台标签。它甚至会将它们推送到您的注册表,所有这些都只需一个命令。

我们首先需要设置 buildx。

% docker buildx create
whimsical_sanderson

我们现在可以为我们的应用程序构建多平台映像。

% docker buildx build --pull -t aspnetapp -f Dockerfile.alpine-non-root --platform linux/arm64,linux/arm,linux/amd64 .

在这里,我们正在构建三种架构。在某些环境中,您还可以仅指定体系结构作为简写,避免重复“linux”。

使用该命令,您将看到以下警告。

WARNING: No output specified with 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

如果要将映像推送到注册表,则需要添加参数并为参数使用完全指定的注册表名称。或者,您可以使用将图像导出到 Docker 缓存。然而,仅当一次针对一种架构时才有效。--push-t--load--load

让我们尝试一下(使用我的注册表;您需要切换到您自己的注册表)。--push

% docker buildx build --pull --push -t dotnetnonroot.azurecr.io/aspnetapp -f Dockerfile.alpine-non-root --platform linux/arm64,linux/arm,linux/amd64 .

该命令将 3 个图像和 1 个标签推送到注册表。

我现在可以尝试在我的 Apple 笔记本电脑上提取图像。它在我的 Raspberry Pi 上也能发挥同样的作用。

% docker run --rm -d -p 8080:8080 dotnetnonroot.azurecr.io/aspnetapp
08968dcce418db4d6f746bfa3a5f2afdcf66570bc8a726c4f5a4859e8666e354
% curl http://localhost:8080/Environment
{"runtimeVersion":".NET 8.0.0-preview.2.23128.3","osVersion":"Linux 5.15.49-linuxkit #1 SMP PREEMPT Tue Sep 13 07:51:32 UTC 2022","osArchitecture":"Arm64","user":"app","processorCount":4,"totalAvailableMemoryBytes":4124512256,"memoryLimit":0,"memoryUsage":29548544}%
% docker exec 08968dcce418db4d6f746bfa3a5f2afdcf66570bc8a726c4f5a4859e8666e354 uname -a
Linux 5d4a712c32b9 5.15.49-linuxkit #1 SMP PREEMPT Tue Sep 13 07:51:32 UTC 2022 aarch64 Linux
% docker kill 08968dcce418db4d6f746bfa3a5f2afdcf66570bc8a726c4f5a4859e8666e354

我现在将在 x64 机器上尝试相同的图像。

$ docker run --rm -d -p 8080:8080 dotnetnonroot.azurecr.io/aspnetapp
6dac425acc325da1c085608d503d6c884610cfa5b2a7dd93575f20355daec1a2
$ curl http://localhost:8080/Environment
{"runtimeVersion":".NET 8.0.0-preview.2.23128.3","osVersion":"Linux 4.4.180+ #42962 SMP Tue Sep 20 22:35:50 CST 2022","osArchitecture":"X64","user":"app","processorCount":8,"totalAvailableMemoryBytes":8096030720,"memoryLimit":9223372036854771712,"memoryUsage":94019584}
$ docker exec 6dac425acc325da1c085608d503d6c884610cfa5b2a7dd93575f20355daec1a2 uname -a
Linux 6dac425acc32 4.4.180+ #42962 SMP Tue Sep 20 22:35:50 CST 2022 x86_64 Linux
$ docker kill 6dac425acc325da1c085608d503d6c884610cfa5b2a7dd93575f20355daec1a2

结果看起来不错,过程也很简单。

标签:8080,--,注册表,buildx,跨平台,linux,镜像,docker
From: https://blog.51cto.com/wangshiyu/8303789

相关文章

  • 深入探讨Vue.js核心技术及uni-app跨平台开发实践
    Vue.js是一款流行的JavaScript框架,用于构建交互性强、响应式的用户界面。而uni-app是一个基于Vue.js的跨平台应用开发框架,允许开发者使用Vue.js的语法编写一次代码,然后将其部署到多个平台,如iOS、Android、Web等。本文将深入探讨Vue.js的核心技术,并介绍如何利用uni-app进行跨平台实......
  • docker运行单个locust脚本
    dockerpulllocustio/locustdockerrun-d--namemylocust-p8089:8089-v/d/GisLocust/locustfiles:/mnt/locustlocustio/locust-f/mnt/locust/locust_demo.py命令注释:-p8089:8089>>>将docker的8089映射到本地的8089(这样你在本地http://localhost:8089/可以打开......
  • docker导入导出镜像
    导出dockersave-o<保存路径>/myimage.tarmyimage:latest导入dockerload-i<路径>/myimage.tar导出dockerexport<容器ID>>mycontainer.tar导入dockerimportmycontainer.tar......
  • docker通过tcp推送镜像
    1,打包2,创建dockerFile文件FROManapsix/alpine-java:8_server-jre_unlimitedMAINTAINERLionLiRUNmkdir-p/hnapg/basedata/logs\/hnapg/basedata/temp\/hnapg/skywalking/agentWORKDIR/hnapg/basedataENVSERVER_PORT=9205EXPOSE${SERVER_PORT}......
  • podman 容器管理 docker替代,进阶版本?
    简介Docker的一个缺点是它有一个中央守护进程,它以root用户的身份运行,这对安全有影响。但这正是Podman的用武之地。padman完全兼容docker命令和镜像。Podman是一个无守护进程容器引擎,用于开发、管理和在你的Linux系统上以root或无root模式运行OCI容器。安装安......
  • docker redis
    dockerrun--restart=always-p6379:6379--nameredis-dredis:latest--requirepass123456dockerrun--restart=always\-p6379:6379\--nameredis\-v/opt/redis/conf/redis.conf:/etc/redis/redis.conf\-v/opt/redis/data:/data\-dredisredis-s......
  • Linux常用命令-docker
     1、进入容器: dockercontainerexec-it容器id/bin/bash①直接进入容器中的mongodb:sudodockerexec-itmongomongosh②dockerexec-itcontainerName/bin/bash2、容器开机自启动:①docker开机自启动:systemctlenabledocker.servic......
  • docker-compose自建RustDesk远程控制服务器
    github: rustdesk/rustdesk-server:RustDeskServerProgram(github.com)一、创建  docker-compose.yml 文件,复制以下 docker-compose配置文件内容到文件version:'3'networks:rustdesk-net:external:falseservices:hbbs:container_name:hbbspo......
  • Python pip镜像源配置
    一、选择国内常用镜像源国内常用的镜像源有阿里云、清华大学、中国科技大学、华中理工大学、山东理工大学、豆瓣等。#阿里云镜像源http://mirrors.aliyun.com/pypi/simple/#清华大学镜像源https://pypi.tuna.tsinghua.edu.cn/simple/#中国科技大学镜像源http://pypi.......
  • Docker 基础:Dockerfile & docker-compose
    DockerfileDockerfile是实现自定镜像的一种手段,通过编写Dockerfile,来编译成自己想要的镜像。FROM{image_name}:{image_tag}#指定基础镜像MAINTAINER{userinfo}#维护人信息USER{username}#指定RUN、CMD或ENTRYPOINT运行时使用的用户WORKDIR{workdir}#为后......