[英]Docker images builds with Bazel on Apple M1
我设置了一个使用 Bazel 构建/打包我的 Python 应用程序的新项目。 该项目使用rules_python
使用我的源文件设置py_binary
规则,并使用rules_docker
设置py_image
规则来构建我的图像。
我能够成功地bazel run
py_binary
。
但是在尝试运行py_image
规则时,它会成功构建映像,但无法运行二进制入口点并引发以下错误:
INFO: Analyzed target //demo:demo_img (110 packages loaded, 12496 targets configured).
INFO: Found 1 target...
Target //demo:demo_img up-to-date:
bazel-out/darwin_arm64-fastbuild-ST-9e3a93240a9e/bin/demo/demo_img-layer.tar
INFO: Elapsed time: 8.722s, Critical Path: 3.94s
INFO: 31 processes: 13 internal, 18 darwin-sandbox.
INFO: Build completed successfully, 31 total actions
INFO: Build completed successfully, 31 total actions
f83e52040704: Loading layer [==================================================>] 147.1MB/147.1MB
Loaded image ID: sha256:078152695f1056177bd21cd96171245f42f7415f5a1ff802b20fbd973eecddfd
Tagging 078152695f1056177bd21cd96171245f42f7415f5a1ff802b20fbd973eecddfd as bazel/demo:demo_img
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
Traceback (most recent call last):
File "/app/demo/demo_img.binary", line 392, in <module>
Main()
File "/app/demo/demo_img.binary", line 382, in Main
os.execv(args[0], args)
OSError: [Errno 8] Exec format error: '/app/demo/demo_img.binary.runfiles/python3_8_aarch64-apple-darwin/bin/python3'
查看生成的图像
docker run -it --entrypoint sh bazel/demo:demo_img
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
/app/demo/demo_img.binary.runfiles/__main__ # uname -a
Linux c94f44a24832 5.10.104-linuxkit #1 SMP PREEMPT Thu Mar 17 17:05:54 UTC 2022 aarch64 Linux
我当前的设置还使用了一个密封的 Python 解释器,遵循这篇博文: https://thethoughtfulkoala.com/posts/2020/05/16/bazel-hermetic-python.ZFC365FDC708D5FC769
我假设由于操作系统类型不匹配而存在此问题? Python 二进制文件是使用apple/darwin
的解释器构建的,其中图像基于linux
?
在 M1 Macbook 上开发时,如何配置py_image
为linux
构建二进制文件?
附录:
以下文件是我的示例项目的一部分:
__main__.py
from flask import Flask
app = Flask(__name__)
@app.route("/", methods=["GET"])
def root():
return "OK"
if __name__ == "__main__":
app.run()
BUILD.bazel
load("@rules_python//python:defs.bzl", "py_binary")
load("@io_bazel_rules_docker//python3:image.bzl", py_image = "py3_image")
py_binary(
name = "demo_bin",
srcs = ["__main__.py"],
imports = [".."],
main = "__main__.py",
visibility = ["//:__subpackages__"],
deps = [
"@python_deps_flask//:pkg",
],
)
container_image(
name = "py_alpine_base",
base = "@python-alpine//image",
symlinks = {
"/usr/bin/python": "/usr/local/bin/python", # To work as base for py3_image
"/usr/bin/python3": "/usr/local/bin/python3", # To work as base for py3_image
},
)
py_image(
name = "demo_img",
srcs = ["__main__.py"],
base = "//:py_alpine_base",
main = "__main__.py",
deps = [
"@python_deps_flask//:pkg",
],
)
其中python-alpine
在WORKSPACE
中定义。 它引用了来自 dockerhub 的arm64
映像。
load("@io_bazel_rules_docker//container:container.bzl", "container_pull")
container_pull(
name = "python-alpine",
registry = "index.docker.io",
repository = "arm64v8/python",
tag = "3.8-alpine",
)
该错误通常意味着容器主机的指令集与尝试启动的容器镜像的指令集不匹配。
在构建命令中使用 —platform 并指定 linux/amd64
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.