如何使用 Apple Silicon 主机在基于 Debian 的 Dockerfile 中安装 msodbcsql?

How to install msodbcsql in Debian-based Dockerfile with an Apple Silicon host?

我想做什么

使用以下 Dockerfiledocker build 命令将 Microsoft 的 ODBC 驱动程序安装到 Docker 映像中。:

FROM public.ecr.aws/docker/library/python:3.9.10-slim-buster

RUN apt-get update
RUN apt-get install -y curl gnupg
RUN curl -sSL https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl -sSL https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list
RUN apt-get update
RUN ACCEPT_EULA=Y apt-get install -y msodbcsql18

此 Docker 文件的大部分内容由 Microsoft 关于如何 Install the Microsoft ODBC driver for SQL Server (Linux), specifically the Debian 指令的指令组成。

我期望发生什么

成功构建 Docker 映像。

实际发生了什么

 => ERROR [7/7] RUN ACCEPT_EULA=Y apt-get install -y msodbcsql18                                                                                0.7s
------                                                                                                                                               
 > [7/7] RUN ACCEPT_EULA=Y apt-get install -y msodbcsql18:                                                                                           
#10 0.192 Reading package lists...
#10 0.541 Building dependency tree...
#10 0.610 Reading state information...
#10 0.661 E: Unable to locate package msodbcsql18
------
executor failed running [/bin/sh -c ACCEPT_EULA=Y apt-get install -y msodbcsql18]: exit code: 100

我在多台不同处理器类型的 MacBook Pro 上同时观察到这个问题,然后得出这是“Apple 芯片问题”的结论。我使用不同MacBook的观察结果如下:

 - MacBook Pro (14-inch, 2021) (M1)    (FAILS TO BUILD)
 - MacBook Pro (16-inch, 2021) (M1)    (FAILS TO BUILD)
 - MacBook Pro (13-inch, 2020) (Intel) (SUCCESSFUL BUILD)
 - MacBook Pro (16-inch, 2019) (Intel) (SUCCESSFUL BUILD) (2 different MacBooks tested)

其他详情

我已确认 public.ecr.aws/docker/library/python:3.9.10-slim-buster 是基于 Debian 10 的映像,方法是在由该映像制作的基本容器中执行 cat /etc/os-release,结果是:

PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

结论

鉴于上述拦截器,当 Docker 安装在 MacBook Pro 运行 上时,如何在 Docker 图像 中成功 install the Microsoft ODBC driver for SQL Server正在使用 Apple 的芯片?

为什么会这样? This is a result of Microsoft lacking packages that support arm64 architecture (Apple silicon is ARM-based)。我不知道的是,这显然是在 Docker 以原始问题中描述的方式请求包裹时在较低级别观察到的细节。

解决方案 解决方案是在构建镜像时指定支持的平台架构。这可以作为 docker build 的参数来完成,也可以在 FROMDockerfile 中的图像标识符之间添加。

我使用 linux/amd64 取得了成功,如图所示:

  • 从命令行

    • docker build --platform=linux/amd64 .
  • Dockerfile

    • FROM --platform=linux/amd64 public.ecr.aws/docker/library/python:3.9.10-slim-buster