因容器创建的卷内符号链接导致Docker-compose build失败
我明白你遇到的这个头疼的问题:Airflow在Docker容器里生成的latest软链接在宿主机完全无效,每次执行docker-compose build都会因为这个链接报错,之前配置.dockerignore也没起作用。下面给你几个可行的解决办法,一步步来搞定:
1. 修正.dockerignore的匹配规则
你之前写的./logs根本没命中实际的日志目录!你的日志目录是airflow/logs,所以得把.dockerignore改成这样:
# .dockerignore 文件内容 airflow/logs/ **/logs/ # 可选,这条规则可以忽略所有子目录里的logs文件夹,更保险
这样Docker在构建镜像的时候,会直接跳过airflow/logs整个目录,完全不会去读取里面的无效软链接,自然就不会触发报错了。
2. 确认Docker Compose的构建上下文
检查一下你的docker-compose.yml里,airflow服务的build配置是不是用的当前工作目录(也就是***/docker/),示例配置如下:
services: airflow: build: . volumes: - ./airflow/logs:/usr/local/airflow/logs/ # 其他Airflow相关配置...
只要build: .这个构建上下文是正确的,配合上面修正后的.dockerignore,构建时就不会再碰那个麻烦的日志目录了。
3. 额外优化:让宿主机彻底看不到这个软链接(可选)
如果你不仅想解决构建报错,还希望宿主机的airflow/logs目录里完全不出现这个latest链接,可以调整Airflow的配置。找到Airflow的airflow.cfg文件,修改调度器日志的存储路径:
# airflow.cfg # 把原来的调度器日志路径改成容器内的非挂载目录 scheduler_log_folder = /usr/local/airflow/internal_logs/scheduler # 然后在docker-compose的volumes里只挂载日期子目录: # - ./airflow/logs/scheduler:/usr/local/airflow/internal_logs/scheduler
不过这个方法需要调整Airflow的核心配置,相对麻烦一些。如果只是为了解决构建报错,前面两步就完全足够了。
为啥之前的.dockerignore没效果?
很简单,你写的./logs对应的是当前目录下直接的logs文件夹,但你的日志实际是放在airflow/logs子目录里的,路径不匹配,Docker构建时还是会扫描到那个无效软链接,所以才会报错。
验证方法
改完.dockerignore后,先单独执行docker build .测试下构建是否成功,不用启动容器。如果构建没问题,再启动容器运行Airflow,下次执行docker-compose build就不会再因为那个软链接头疼了。
内容的提问来源于stack exchange,提问作者Justinas Marozas

