docker 跨平台构建镜像

news/2024/11/30 12:35:18/

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

文章目录

    • 首先
    • 构建环境
    • 进阶

首先

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

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

FROM python:3.10-slimWORKDIR /appCOPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txtCOPY . .CMD [ "python", "bin/run.py" ]

在这里插入图片描述

构建环境

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

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

查看支持的环境

docker buildx ls

在这里插入图片描述

上传镜像的你的 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

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


http://www.ppmy.cn/news/1102140.html

相关文章

flutter 网络地址URL转file

方法1 import dart:io; import package:http/http.dart as http; import package:path/path.dart; import package:path_provider/path_provider.dart;Future<File> _fileFromImageUrl() async {final response await http.get(Uri.parse(https://example.com/xyz.jpg)…

【Python】conda虚拟环境下使用pyinstaller打包程序为exe

文章目录 一、为什么要用conda虚拟环境二、pyinstaller用法2.1 安装 PyInstaller2.2 基本用法打包一个 Python 脚本2.21 打包一个 Python 项目2.22 打包选项 2.3 打包依赖项2.31 导出依赖项列表2.32 配置依赖项 2.4 自定义打包选项2.5 打包完成后的文件2.6 注意事项 三、打包示…

Android 13 网络 Adb相关流程深入分析研究

Android 13 网络 Adb 分析研究 文章目录 Android 13 网络 Adb 分析研究一、前言二、默认adb 代码实现关键&#xff1a; 1、修改的目录&#xff1a;2、具体修改&#xff1a;&#xff08;1&#xff09;在XXX_device.mk 添加属性&#xff08;2&#xff09;设置固定端口号&#xff…

星际争霸之小霸王之小蜜蜂(十一)--杀杀杀

系列文章目录 星际争霸之小霸王之小蜜蜂&#xff08;十&#xff09;--鼠道 星际争霸之小霸王之小蜜蜂&#xff08;九&#xff09;--狂鼠之灾 星际争霸之小霸王之小蜜蜂&#xff08;八&#xff09;--蓝皮鼠和大脸猫 星际争霸之小霸王之小蜜蜂&#xff08;七&#xff09;--消失…

【AI】《动手学-深度学习-PyTorch版》笔记(二十二):单发多框检测(SSD)

AI学习目录汇总 1、介绍 SSD(Single Shot MultiBox Detector)单发多框检测。“Single shot”说明SSD算法属于one-stage(一段式)方法,“MultiBox”说明SSD是多框预测(多尺度锚框/特征图)。 SSD和YOLO一样都是采用CNN网络执行one-stage(一段式)检测,区别是: YOLO速…

数据结构--6.5二叉排序树(插入,查找和删除)

目录 一、创建 二、插入 三、删除 二叉排序树&#xff08;Binary Sort Tree&#xff09;又称为二叉查找树&#xff0c;它或者是一棵空树&#xff0c;或者是具有下列性质的二叉树&#xff1a; ——若它的左子树不为空&#xff0c;则左子树上所有结点的值均小于它的根结构的值…

postman和node.js的使用

一 nodejs下载 下载链接&#xff1a; nodejs官网&#xff1a; https://nodejs.org/zh-cn/download 我使用的windows .msi安装方式&#xff0c;双击一直下一步就行 当前安装完成后的版本&#xff1a;1.下载 2.安装步骤 下载完成后&#xff0c;双击安装包&#xff0c;开始安装&…

C# 命令行参数分割

CommandLineToArgvW 函数 [DllImport("shell32.dll", SetLastError true)] private static extern IntPtr CommandLineToArgvW([MarshalAs(UnmanagedType.LPWStr)] string lpCmdLine, out int pNumArgs); 参数&#xff1a; [in] lpCmdLine 类型&#xff1a;…