我正在开发一个ETL过程,使用DockerOperator与Apache Airflow一起计划和协调。我在Windows笔记本电脑上工作,所以我只能在docker容器中运行Apache Airflow。我能够使用位于我的项目根目录中的以下docker-compose.yml
文件中指定的卷,将windows笔记本电脑上带有配置文件(下面称为configs
)的文件夹装入airflow容器(下面称为webserver)。下面可以看到docker-compose.yml
文件中的相关代码:
version: '2.1'
webserver:
build: ./docker-airflow
restart: always
privileged: true
depends_on:
- mongo
- mongo-express
environment:
- LOAD_EX=n
- EXECUTOR=Local
volumes:
- ./docker-airflow/dags:/usr/local/airflow/dags
# Volume for source code
- ./src:/src
- ./docker-airflow/workdir:/home/workdir
# configs folder as volume
- ./configs:/configs
# Mount the docker socket from the host (currently my laptop) into the webserver container so that the webserver container can create "sibbling" containers
- //var/run/docker.sock:/var/run/docker.sock # the two "//" are needed for windows OS
ports:
- 8081:8080
command: webserver
healthcheck:
test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
interval: 30s
timeout: 30s
retries: 3
networks:
- mynet
现在,我想将这个configs
文件夹及其所有内容传递给DockerRoperator创建的容器。尽管此configs
文件夹显然已装入Web服务器容器的文件系统,但此configs
文件夹完全为空,因此,我的DAG失败。DockerRoperator的代码如下所示:
cmd = "--config_filepath {} --data_object_name {}".format("/configs/dev.ini", some_data_object)
staging_op = DockerOperator(
command=cmd,
task_id="my_task",
image="{}/{}:{}".format(docker_hub_username, docker_hub_repo_name, image_name),
api_version="auto",
auto_remove=False,
network_mode=docker_network,
force_pull=True,
volumes=["/configs:/configs"] # "absolute_path_host:absolute_path_container"
)
根据文档,卷的左侧必须是主机上的绝对路径,如果我理解正确的话,它就是本例中的webserver容器(因为它为每个任务创建单独的容器)。卷的右侧是DockerRoperator创建的任务容器内的目录。如上所述,任务容器中的configs
文件夹确实存在,但完全为空。有人知道为什么会这样以及如何解决吗
非常感谢你的帮助
在实现来自here的建议后,需要按如下方式指定DockerPropertor构造函数中的卷:
也许文件路径需要这样,因为Docker在Windows上的VM中运行
正如@sarnu还提到的,重要的是要理解,主机端路径是我的windows笔记本电脑上的路径,因为为每个任务创建的容器并行运行/是气流容器的同级容器
在这种情况下,由airflow docker操作员启动的容器与airflow容器“平行”运行,由主机上的docker服务监督。
docker operator调用中声明的所有卷必须是主机上的绝对路径。
docker compose中的卷定义有些特殊,在这种情况下允许相对路径
相关问题 更多 >
编程相关推荐