為了這個問題,我有一個名為script.py.
def hello_world():
print("hello world")
if __name__ == "__main__":
hello_world()
并有相應的Dockerfile:
FROM python:3.8-alpine
WORKDIR /app
COPY requirements.txt requirements.txt
RUN python3 -m pip install --upgrade pip
RUN python3 -m pip install -r requirements.txt
COPY . .
CMD [ "python3", "script.py"]

場景 #1(amd64 作為主機):
當我在這臺主機上構建amd64架構時,我成功了。
$ docker buildx build --platform linux/amd64 -t sntshk/cotu:latest .
WARN[0000] No output specified for 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
[ ] Building 2.6s (11/11) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 277B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/python:3.8-alpine 2.4s
=> [auth] library/python:pull token for registry-1.docker.io 0.0s
=> [1/6] FROM docker.io/library/python:3.8-alpine@sha256:9b3ca9c8e9ec086ea825227ac6d819e46794c29590f04d775d517a48ef6 0.0s
=> => resolve docker.io/library/python:3.8-alpine@sha256:9b3ca9c8e9ec086ea825227ac6d819e46794c29590f04d775d517a48ef6 0.0s
=> [internal] load build context 0.1s
=> => transferring context: 7.55kB 0.1s
=> CACHED [2/6] WORKDIR /app 0.0s
=> CACHED [3/6] COPY requirements.txt requirements.txt 0.0s
=> CACHED [4/6] RUN python3 -m pip install --upgrade pip 0.0s
=> CACHED [5/6] RUN python3 -m pip install -r requirements.txt 0.0s
=> CACHED [6/6] COPY . .
但是構建失敗的arm64架構:
[..output trimmed...]
#8 12.03 File "/usr/local/lib/python3.8/site-packages/pip/_vendor/distro.py", line 125, in linux_distribution
#8 12.03 return _distro.linux_distribution(full_distribution_name)
#8 12.03 File "/usr/local/lib/python3.8/site-packages/pip/_vendor/distro.py", line 681, in linux_distribution
#8 12.03 self.version(),
#8 12.03 File "/usr/local/lib/python3.8/site-packages/pip/_vendor/distro.py", line 741, in version
#8 12.03 self.lsb_release_attr('release'),
#8 12.03 File "/usr/local/lib/python3.8/site-packages/pip/_vendor/distro.py", line 903, in lsb_release_attr
#8 12.03 return self._lsb_release_info.get(attribute, '')
#8 12.03 File "/usr/local/lib/python3.8/site-packages/pip/_vendor/distro.py", line 556, in __get__
#8 12.03 ret = obj.__dict__[self._fname] = self._f(obj)
#8 12.03 File "/usr/local/lib/python3.8/site-packages/pip/_vendor/distro.py", line 1014, in _lsb_release_info
#8 12.03 stdout = subprocess.check_output(cmd, stderr=devnull)
#8 12.03 File "/usr/local/lib/python3.8/subprocess.py", line 415, in check_output
#8 12.03 return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
#8 12.03 File "/usr/local/lib/python3.8/subprocess.py", line 516, in run
#8 12.03 raise CalledProcessError(retcode, process.args,
#8 12.03 subprocess.CalledProcessError: Command '('lsb_release', '-a')' returned non-zero exit status 1.
------
Dockerfile:9
--------------------
7 | COPY requirements.txt requirements.txt
8 |
9 | >>> RUN python3 -m pip install --upgrade pip
10 | RUN python3 -m pip install -r requirements.txt
11 |
--------------------
error: failed to solve: process "/dev/.buildkit_qemu_emulator /bin/sh -c python3 -m pip install --upgrade pip" did not complete successfully: exit code: 1
場景 #2(arm64 作為主機):
我不會在這里放太多噪音,但是在 arm64 上,構建 arm64 影像沒有問題。但是當我嘗試amd64在 arm64 主機上構建映像時,會出現相同的錯誤。
我的最后一個問題是,如何在 arm64 主機上構建 amd64?
uj5u.com熱心網友回復:
您是否不需要arm檔案建議的影像:
構建多平臺鏡像
最后,根據您的專案,您使用的語言可能對交叉編譯有很好的支持。在這種情況下,Dockerfiles 中的多階段構建可以有效地用于使用構建節點的本機架構為 --platform 指定的平臺構建二進制檔案。像 BUILDPLATFORM 和 TARGETPLATFORM 這樣的構建引數串列在您的 Dockerfile 中自動可用,并且可以由作為構建的一部分運行的行程使用。
FROM --platform=$BUILDPLATFORM python:3.8-alpine AS build
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/431609.html
標籤:Python python-3.x 码头工人 手臂 x86-64
上一篇:重建raven資料庫時遇到問題
