代码之家  ›  专栏  ›  技术社区  ›  Tony Liao

Bazel oci_image入口点中的引用环境变量

  •  0
  • Tony Liao  · 技术社区  · 1 年前

    我正试图使用Bazel的rules_oci构建一个Docker镜像,如下所示:

    oci_image(
    name = "move_data_image",
    base = "@python_base",
    entrypoint = [
        "/opt/python/dataflow/move_data",
        "--worker_image",
        "$WORKER_IMAGE",
        "--max_num_workers",
        "$MAX_NUM_WORKERS",
        "--runner",
        "DataflowRunner",
    ],
    env = {
        "WORKER_IMAGE": "",
        "MAX_NUM_WORKERS": -1,
    },
    tars = [":move_data_layer"],
    )
    

    这个想法是使用env-vars作为程序的参数,这样就可以针对不同的执行进行更改。我能够使用Dockerfile实现这种行为:

    ENV WORKER_IMAGE ""
    ENV MAX_NUM_WORKERS -1
    
    ENTRYPOINT python src/process_data.py --worker_image=$WORKER_IMAGE
              --max_num_workers=$MAX_NUM_WORKERS 
              --runner=DataflowRunner
    

    但我很难和巴泽尔一起做到这一点。对于Bazel代码片段,env变量被视为文字字符串,因此我希望出现以下错误:

    error: argument --max_num_workers: invalid int value: '$MAX_NUM_WORKERS'
    

    由于rules_oci有点新,我找不到很多关于正确语法和用法的文档。我想知道是否支持这种用例?提前感谢!

    1 回复  |  直到 1 年前
        1
  •  0
  •   Brian Silverman    1 年前

    这相当于你正在寻找的ENTRYPOINT的“外壳形式”(不过你的基本图像中必须有一个外壳):

    oci_image(
    name = "move_data_image",
    base = "@python_base",
    entrypoint = [
        "/bin/sh", "-c", " ".join([
            "/opt/python/dataflow/move_data",
            "--worker_image",
            "$WORKER_IMAGE",
            "--max_num_workers",
            "$MAX_NUM_WORKERS",
            "--runner",
            "DataflowRunner",
        ]),
    ],
    env = {
        "WORKER_IMAGE": "",
        "MAX_NUM_WORKERS": -1,
    },
    tars = [":move_data_layer"],
    )
    

    你的尝试相当于 ENTRYPOINT ["/opt/python/dataflow/move_data", "--worker_image", "$WORKER_IMAGE", ...] 在Dockerfile中,这也不起作用。你需要一些能读取环境变量的东西。

    而不是使用 sh -c ,您可以修改Python代码以直接读取环境变量。您还可以编写一个包装器(shell脚本、Python或其他东西),读取环境变量并构建命令行。

    推荐文章