python - 如何通过 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
它不会失败,但它也不会打印任何东西。我怎么能做到?谢谢
解决方案
您需要将您的安装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
推荐阅读
- python - 运行文件并运行选择为 Spyder 中的同一段代码提供不同的输出
- python - 如何将文件与在 Python 中引用它们的 xml 关联?
- python - “命令”对象没有属性“has_permissions”
- asp.net-core - 机密客户端应用程序缓存 - GetAccountAsync
- c# - 为什么我不能在 Visual Studio 中移动 Windows 窗体?
- python - 从 python 在符号链接目录中运行 Makefile
- c# - 转到行/循环切换语句?
- rust - Rust - 类型的值不能从 `std::iter::Iterator<>` 构建
- c++ - c ++:原子变量的值在保存在局部变量中时无效
- .net - .net 核心网络应用程序 docker 映像如何在 Mac OS 上运行?