运行docker-compose启动Airflow2.0时airflow-entrypoint.sh权限被拒绝如何解决
问题原因
这个报错是因为airflow-entrypoint.sh脚本没有可执行权限,你通过docker-compose把本地./scripts目录挂载到了容器的/opt/airflow/scripts路径,容器启动时调用该脚本没有执行权限导致启动失败。
解决方案
你可以根据自己的使用场景选择以下任意一种方案:
方案1:直接修改本地脚本权限(推荐,适合开发环境经常修改脚本的场景)
在你的项目根目录执行本地命令赋予脚本执行权限即可:
chmod +x ./scripts/airflow-entrypoint.sh
修改完成后重新执行docker-compose up --build即可正常启动。
方案2:修改docker-compose启动命令,无需改权限
如果不想修改本地文件权限,可以直接修改docker-compose.yml中webserver和scheduler服务的entrypoint配置,用bash直接调用脚本:
原来的配置:
entrypoint: ./scripts/airflow-entrypoint.sh
修改为:
entrypoint: ["bash", "./scripts/airflow-entrypoint.sh"]
方案3:将脚本打包进镜像(适合生产环境不需要本地挂载修改脚本的场景)
如果你不需要本地挂载scripts目录实时修改脚本,可以按以下步骤操作:
- 修改Dockerfile,添加复制脚本和赋予权限的步骤,注意要在USER切换到普通用户之前操作:
FROM apache/airflow USER root ARG AIRFLOW_HOME=/opt/airflow ADD dags /opt/airflow/dags # 新增:复制本地scripts目录到镜像内 ADD scripts /opt/airflow/scripts # 新增:赋予脚本执行权限 RUN chmod +x /opt/airflow/scripts/airflow-entrypoint.sh RUN pip install --upgrade pip RUN chown -R airflow:airflow $AIRFLOW_HOME USER airflow RUN pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org boto3 USER ${AIRFLOW_UID}
- 删除docker-compose.yml中scheduler和webserver服务下的
- ./scripts:/opt/airflow/scriptsvolume挂载配置,避免本地目录覆盖镜像内的脚本。
额外优化建议
你当前的entrypoint脚本硬编码了启动scheduler和webserver两个进程,但你在docker-compose中将scheduler和webserver拆成了两个独立服务,会导致两个服务都同时启动两个进程,出现冲突,而且你配置的command参数会完全失效。建议修改entrypoint脚本如下:
#!/usr/bin/env bash airflow db init airflow db upgrade # 仅在webserver服务启动时执行用户创建,避免重复执行 if [ "$1" = "webserver" ]; then airflow users create -r Admin -u admin -e MY_EMAIL -f MY_FIRSTNAME -l MY_LASTNAME -p admin fi exec "$@"
修改后两个服务会各自执行command配置的启动命令,不会重复启动进程。
内容的提问来源于stack exchange,提问作者Shadow Walker
相关产品推荐
相关产品推荐

