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

5
我想要做的事情:
使用以下的 Dockerfile 和 docker 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

这个 Dockerfile 的大部分是来自于 Microsoft 的指令,用于在 Linux 上安装 Microsoft SQL Server ODBC 驱动程序,具体来说是Debian的指令。 我期望发生的情况 Docker 镜像能够成功构建。 实际发生的情况
  • docker build基于 Intel 的 MacBook Pro 上运行时可以成功构建镜像。
  • docker build基于 Apple Silicon M1 的 MacBook Pro 上运行时会返回以下错误
 => 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 上观察了这个问题,得出结论这是一个“苹果硅芯片问题”。我的观察结果如下:
 - 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/"

结论:
鉴于上述阻碍,当在 MacBook Pro 上安装了 Docker,并且该设备运行着苹果的芯片时,我应该如何成功地在 Docker 镜像中安装 Microsoft ODBC 驱动程序以连接 SQL Server?
2个回答

6
为什么会出现这种情况? 这是由于Microsoft缺少支持arm64架构的软件包Apple silicon基于ARM)。我并不知道,在Docker中以原始问题描述的方式请求软件包时,这显然是一个在较低级别上观察到的细节。 解决方案 解决方案是在构建镜像时指定受支持的平台架构。这可作为docker build的参数来完成,也可以在Dockerfile中在FROM和镜像标识符之间添加。
我尝试使用linux/amd64成功:
  • 从命令行

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

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

1
最新文档中我们读到:

Microsoft ODBC 驱动程序适用于 macOS 上的 SQL Server 仅支持 x64 架构,版本为 17.7。从版本 17.8 开始添加了 Apple M1(ARM64)支持。Homebrew 公式会检测架构并自动安装正确的软件包。如果您的命令提示符在 M1 上运行 x64 模拟模式,则会安装 x64 软件包。如果您的命令提示符未在仿真模式下运行,则会安装 ARM64 软件包。此外,M1 更改了 Homebrew 默认目录为 /opt/homebrew。以下路径使用 x64 Homebrew 路径,默认为 /usr/local,因此您的文件路径会有所不同。

我也正在使用 python-slim-buster docker 镜像,因此是基于 Debian 的,在 ARM(M1 和 M2)上,我成功地通过以下方式安装了 msodbcsql

RUN sh -c "curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -" \
    && apt-get update \
    && sh -c "curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list > /etc/apt/sources.list.d/mssql-release.list" \
    && apt-get update \
    && ACCEPT_EULA=Y apt-get install -y msodbcsql18 \
    && ACCEPT_EULA=Y apt-get install -y mssql-tools18

不知道为什么,但如果你添加的是 Debian 配置而不是 Ubuntu,它似乎不起作用。以下示例应该可以工作,但实际上并不起作用。
RUN sh -c "curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -" \
    && apt-get update \
    && sh -c "curl https://packages.microsoft.com/config/debian/`lsb_release -rs`/prod.list > /etc/apt/sources.list.d/mssql-release.list" \
    && apt-get update \
    && ACCEPT_EULA=Y apt-get install -y msodbcsql18 \
    && ACCEPT_EULA=Y apt-get install -y mssql-tools18

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接