首页 > 解决方案 > 如何通过 docker-compose 将 Makefile 中的变量传递给 Python 脚本

问题描述

我有一个运行 docker-compose 的 Makefile,它有一个执行 python 脚本的容器。我希望能够将命令行中的变量传递给 Makefile 并在 python 脚本 ( testing.py) 中打印它。

我的目录如下所示:

main_folder:
  -docker-compose.yaml
  -Makefile
  -testing.py

我尝试过以下配置。生成文件是:

.PHONY: run run-prod stop stop-prod rm

run:
    WORKING_DAG=$(working_dag) docker-compose -f docker-compose.yml up -d --remove-orphans --build --force-recreate

码头工人组成是:

version: "3.7"
services:
  prepare_files:
    image: apache/airflow:1.10.14
    environment:
      WORKING_DAG: ${working_dag}
      PYTHONUNBUFFERED: 1
    entrypoint: /bin/bash
    command: -c "python3 testing.py $$WORKING_DAG"

文件 testing.py 是:

import sys

print(sys.argv[0], flush=True)

当我在命令行中运行时:

 make working_dag=testing run

它不会失败,但它也不会打印任何东西。我怎么能做到?谢谢

标签: pythondockervariablesmakefiledocker-compose

解决方案


您需要将您的安装testing.py到容器中(使用volumes)。在下文中,将使用您当前的工作目录 ( ${PWD}) 并将testing.py其挂载在容器的根目录中:

version: "3.7"
services:
  prepare_files:
    image: apache/airflow:1.10.14
    volumes:
      - ${PWD}/testing.py:/testing.py
    environment:
      PYTHONUNBUFFERED: 1
    entrypoint: /bin/bash
    command: -c "python3 /testing.py ${WORKING_DAG}"

注意无需包含WORKING_DAG在服务定义中,因为它已通过 Makefile 暴露给 Docker Compose 环境。像你一样设置它,用""(empty string) 覆盖它,因为它${working_dag}是你原来的环境变量,但是你WORKING_DAG在 Makefilerun步骤中重新映射了它。

import sys

print(sys.argv[0:], flush=True)

然后:

make --always-make working_dag=Freddie run
WORKING_DAG=Freddie docker-compose --file=./docker-compose.yaml up
Recreating 66014039_prepare_files_1 ... done
Attaching to 66014039_prepare_files_1
prepare_files_1  | ['/testing.py', 'Freddie']
66014039_prepare_files_1 exited with code 0

推荐阅读