我正在try 为一个Python(Django)应用程序构建一个docker,这需要Microsoft ODBC 18,我使用下面的docker文件:

FROM python:latest

RUN apt update
RUN apt-get install -y gcc libc-dev g++ libffi-dev libxml2 unixodbc-dev unixodbc

RUN curl https://packages.microsoft.com/keys/microsoft.asc | tee /etc/apt/trusted.gpg.d/microsoft.asc \
    && curl https://packages.microsoft.com/config/debian/12/prod.list | tee /etc/apt/sources.list.d/mssql-release.list \
    && apt-get update \
    && ACCEPT_EULA=Y apt-get install -y msodbcsql18 \
    && echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc

RUN odbcinst -j

WORKDIR /app

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

COPY . /app/

CMD ["bash"]

命令的某些部分引用自 https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server

Docker Error Log:

Sending build context to Docker daemon  635.9kB
Step 1/10 : FROM python:latest
 ---> d8be44680b2e
Step 2/10 : RUN apt update
 ---> Using cache
 ---> 462376801705
Step 3/10 : RUN apt-get install -y gcc libc-dev g++ libffi-dev libxml2 unixodbc-dev unixodbc
 ---> Using cache
 ---> 4804e4898355
Step 4/10 : RUN curl https://packages.microsoft.com/keys/microsoft.asc | tee /etc/apt/trusted.gpg.d/microsoft.asc     && curl https://packages.microsoft.com/config/debian/12/prod.list | tee /etc/apt/sources.list.d/mssql-release.list     && apt-get update     && ACCEPT_EULA=Y apt-get install -y msodbcsql18     && echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc
 ---> Running in e2adb15edb3e
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   983  100   983    0     0  16821      0 --:--:-- --:--:-- --:--:-- 16948
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.7 (GNU/Linux)

mQENBFYxWIwBCADAKoZhZlJxGNGWzqV+1OG1xiQeoowKhssGAKvd+buXCGISZJwT
LXZqIcIiLP7pqdcZWtE9bSc7yBY2MalDp9Liu0KekywQ6VVX1T72NPf5Ev6x6DLV
7aVWsCzUAF+eb7DC9fPuFLEdxmOEYoPjzrQ7cCnSV4JQxAqhU4T6OjbvRazGl3ag
OeizPXmRljMtUUttHQZnRhtlzkmwIrUivbfFPD+fEoHJ1+uIdfOzZX8/oKHKLe2j
H632kvsNzJFlROVvGLYAk2WRcLu+RjjggixhwiB+Mu/A8Tf4V6b+YppS44q8EvVr
M+QvY7LNSOffSO6Slsy9oisGTdfE39nC7pVRABEBAAG0N01pY3Jvc29mdCAoUmVs
ZWFzZSBzaWduaW5nKSA8Z3Bnc2VjdXJpdHlAbWljcm9zb2Z0LmNvbT6JATUEEwEC
AB8FAlYxWIwCGwMGCwkIBwMCBBUCCAMDFgIBAh4BAheAAAoJEOs+lK2+EinPGpsH
/32vKy29Hg51H9dfFJMx0/a/F+5vKeCeVqimvyTM04C+XENNuSbYZ3eRPHGHFLqe
MNGxsfb7C7ZxEeW7J/vSzRgHxm7ZvESisUYRFq2sgkJ+HFERNrqfci45bdhmrUsy
7SWw9ybxdFOkuQoyKD3tBmiGfONQMlBaOMWdAsic965rvJsd5zYaZZFI1UwTkFXV
KJt3bp3Ngn1vEYXwijGTa+FXz6GLHueJwF0I7ug34DgUkAFvAs8Hacr2DRYxL5RJ
XdNgj4Jd2/g6T9InmWT0hASljur+dJnzNiNCkbn9KbX7J/qK1IbR8y560yRmFsU+
NdCFTW7wY0Fb1fWJ+/KTsC4=
=J6gs
-----END PGP PUBLIC KEY BLOCK-----
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   138  100   138    0     0   1403      0 --:--:-- --:--:-- --:--:--  1408
deb [arch=amd64,arm64,armhf signed-by=/usr/share/keyrings/microsoft-prod.gpg] https://packages.microsoft.com/debian/12/prod bookworm main
Hit:1 http://deb.debian.org/debian bookworm InRelease
Get:2 http://deb.debian.org/debian bookworm-updates InRelease [52.1 kB]
Get:3 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
Get:4 https://packages.microsoft.com/debian/12/prod bookworm InRelease [3617 B]
Err:4 https://packages.microsoft.com/debian/12/prod bookworm InRelease
  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY EB3E94ADBE1229CF
Reading package lists...
W: GPG error: https://packages.microsoft.com/debian/12/prod bookworm InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY EB3E94ADBE1229CF
E: The repository 'https://packages.microsoft.com/debian/12/prod bookworm InRelease' is not signed.
The command '/bin/sh -c curl https://packages.microsoft.com/keys/microsoft.asc | tee /etc/apt/trusted.gpg.d/microsoft.asc     && curl https://packages.microsoft.com/config/debian/12/prod.list | tee /etc/apt/sources.list.d/mssql-release.list     && apt-get update     && ACCEPT_EULA=Y apt-get install -y msodbcsql18     && echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc' returned a non-zero code: 100
ERROR: Service 'backend' failed to build : Build failed

More Context

此扩展坞运行在ARM系统上,特别是使用Raspberry PI OS的Raspberry PI 5(8 GB RAM).
为了支持ARM的ODBC驱动程序,我引用了这个GitHub issue,它说明ARM支持版本18,但不支持版本17.

try 解决方案1

RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg \
    && mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg \
    && curl https://packages.microsoft.com/config/debian/12/prod.list > /etc/apt/sources.list.d/mssql-release.list \
    && apt-get update \
    && ACCEPT_EULA=Y apt-get install -y msodbcsql18 \
     && echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc

返回几乎相同的错误日志(log)

try 的解决方案2

RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg \
    && mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg \
    && curl https://packages.microsoft.com/config/debian/12/prod.list > /etc/apt/sources.list.d/mssql-release.list \
    && apt-get update --allow-insecure-repositories \
    && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EB3E94ADBE1229CF \
    && ACCEPT_EULA=Y apt-get install -y msodbcsql18 \
    && echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc

Solution 2 Error Log

Building backend
Sending build context to Docker daemon  635.9kB
Step 1/10 : FROM python:latest
 ---> d8be44680b2e
Step 2/10 : RUN apt update
 ---> Using cache
 ---> 462376801705
Step 3/10 : RUN apt-get install -y gcc libc-dev g++ libffi-dev libxml2 unixodbc-dev unixodbc
 ---> Using cache
 ---> 4804e4898355
Step 4/10 : RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg     && mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg     && curl https://packages.microsoft.com/config/debian/12/prod.list > /etc/apt/sources.list.d/mssql-release.list     && apt-get update --allow-insecure-repositories     && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EB3E94ADBE1229CF     && ACCEPT_EULA=Y apt-get install -y msodbcsql18     && echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc
 ---> Running in 8bff72a76121
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   983  100   983    0     0  16094      0 --:--:-- --:--:-- --:--:-- 16383
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   138  100   138    0     0   1317      0 --:--:-- --:--:-- --:--:--  1326
Hit:1 http://deb.debian.org/debian bookworm InRelease
Get:2 http://deb.debian.org/debian bookworm-updates InRelease [52.1 kB]
Get:3 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
Get:4 https://packages.microsoft.com/debian/12/prod bookworm InRelease [3617 B]
Ign:4 https://packages.microsoft.com/debian/12/prod bookworm InRelease
Get:5 https://packages.microsoft.com/debian/12/prod bookworm/main amd64 Packages [29.0 kB]
Get:6 https://packages.microsoft.com/debian/12/prod bookworm/main all Packages [342 B]
Get:7 https://packages.microsoft.com/debian/12/prod bookworm/main armhf Packages [5287 B]
Get:8 https://packages.microsoft.com/debian/12/prod bookworm/main arm64 Packages [5812 B]
Fetched 144 kB in 0s (377 kB/s)
Reading package lists...
W: GPG error: https://packages.microsoft.com/debian/12/prod bookworm InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY EB3E94ADBE1229CF
W: The repository 'https://packages.microsoft.com/debian/12/prod bookworm InRelease' is not signed.
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
Executing: /tmp/apt-key-gpghome.T3Z92aFNHv/gpg.1.sh --keyserver keyserver.ubuntu.com --recv-keys EB3E94ADBE1229CF
gpg: key EB3E94ADBE1229CF: "Microsoft (Release signing) <gpgsecurity@microsoft.com>" not changed
gpg: Total number processed: 1
gpg:              unchanged: 1
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  odbcinst
The following NEW packages will be installed:
  msodbcsql18 odbcinst
0 upgraded, 2 newly installed, 0 to remove and 2 not upgraded.
Need to get 703 kB of archives.
After this operation, 87.0 kB of additional disk space will be used.
WARNING: The following packages cannot be authenticated!
  msodbcsql18
E: There were unauthenticated packages and -y was used without --allow-unauthenticated
The command '/bin/sh -c curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg     && mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg     && curl https://packages.microsoft.com/config/debian/12/prod.list > /etc/apt/sources.list.d/mssql-release.list     && apt-get update --allow-insecure-repositories     && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EB3E94ADBE1229CF     && ACCEPT_EULA=Y apt-get install -y msodbcsql18     && echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc' returned a non-zero code: 100
ERROR: Service 'backend' failed to build : Build failed

推荐答案

此错误是由于缺少/usr/share/keyrings/microsoft-prod.gpg的Microsoft键,您有两种 Select ,

Option 1: Remove signed-by value (Recommended)

在Microsoft notes中建议使用此方法,

https://packages.microsoft.com/config/debian/12/prod.list中的原创内容是AS,

deb [arch=amd64,arm64,armhf signed-by=/usr/share/keyrings/microsoft-prod.gpg] https://packages.microsoft.com/debian/12/prod bookworm main

在go 掉signed-by之后,

deb [arch=amd64,arm64,armhf] https://packages.microsoft.com/debian/12/prod bookworm main

所以,你的 docker 文件应该是这样的,

FROM python:latest

RUN apt update
RUN apt-get install -y gcc libc-dev g++ libffi-dev libxml2 unixodbc-dev unixodbc

RUN curl https://packages.microsoft.com/keys/microsoft.asc | tee /etc/apt/trusted.gpg.d/microsoft.asc \
    && echo "deb [arch=amd64,arm64,armhf] https://packages.microsoft.com/debian/12/prod bookworm main" | tee /etc/apt/sources.list.d/mssql-release.list \
    && apt-get update \
    && ACCEPT_EULA=Y apt-get install -y msodbcsql18 \
    && echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc

RUN odbcinst -j

WORKDIR /app

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

COPY . /app/

CMD ["bash"]

选项2:添加Microsoft密钥

通过以下命令添加您的Microsoft密钥环文件,

curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg

有关更多信息,请参见here.

Linux相关问答推荐

空字符串和空文件的区别

在新环境中使用Unicode范围的sed表达式有问题

在64位Linux Mint 21.2 Mate上呈现nvim中的文本对象时出现问题

在具有不同文件类型的文件夹中编辑多个 xml 文件 - 使用预定顺序

我可以在不调用 shell 的情况下使用 popen() 吗?在 C++ 中

为什么控制台不接受反向换行?

使用打印命令 Select 子域

如何判断 Linux 机器是否支持 AVX/AVX2 指令?

如何使用完整路径或文件名显示 grep 结果

如何使用不同的出口 IP 一次运行多个 Tor 进程?

是否可以在 Linux x86 GAS 程序集中创建没有系统调用的线程?

打印当前一周的星期一的日期(在 bash 中)

Linux 和 I/O 完成端口?

低功耗蓝牙:在 linux 中监听通知/指示

execv() 和 fork() 的时间浪费

Linux 上真的没有异步块 I/O 吗?

ctrl-x 在终端中使用时会发送哪个信号?

Python日志(log)记录 - 判断日志(log)文件的位置?

如何在 UNIX 中将字符串转换为整数

为嵌入式 Linux 设备实施更新/升级系统