如何使用 Apple Silicon 主机在基于 Debian 的 Dockerfile 中安装 msodbcsql?
How to install msodbcsql in Debian-based Dockerfile with an Apple Silicon host?
我想做什么
使用以下 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
此 Docker 文件的大部分内容由 Microsoft 关于如何 Install the Microsoft ODBC driver for SQL Server (Linux), specifically the Debian 指令的指令组成。
我期望发生什么
成功构建 Docker 映像。
实际发生了什么
docker build
成功 如果 Docker 在 基于英特尔的 MacBook Pro。
docker build
returns以下错误当Docker为运行 基于 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 上同时观察到这个问题,然后得出这是“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
的参数来完成,也可以在 FROM
和 Dockerfile
中的图像标识符之间添加。
我使用 linux/amd64
取得了成功,如图所示:
从命令行
docker build --platform=linux/amd64 .
在Dockerfile
FROM --platform=linux/amd64 public.ecr.aws/docker/library/python:3.9.10-slim-buster
我想做什么
使用以下 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
此 Docker 文件的大部分内容由 Microsoft 关于如何 Install the Microsoft ODBC driver for SQL Server (Linux), specifically the Debian 指令的指令组成。
我期望发生什么
成功构建 Docker 映像。
实际发生了什么
docker build
成功 如果 Docker 在 基于英特尔的 MacBook Pro。docker build
returns以下错误当Docker为运行 基于 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 上同时观察到这个问题,然后得出这是“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
的参数来完成,也可以在 FROM
和 Dockerfile
中的图像标识符之间添加。
我使用 linux/amd64
取得了成功,如图所示:
从命令行
docker build --platform=linux/amd64 .
在
Dockerfile
FROM --platform=linux/amd64 public.ecr.aws/docker/library/python:3.9.10-slim-buster