У меня есть настройка, в которой воздушный поток работает в контейнере докеров, и его каталог журналов сопоставлен с каталогом на хосте. Во время работы он создает ссылку на файловую систему /usr/local/airflow/logs/scheduler/latest
, которая имеет допустимую цель внутри контейнера, но не на хосте. При следующем запуске docker-compose build
он срабатывает по этой ссылке и завершается сбоем сборки.
Я пытался игнорировать каталог журналов в .dockerignore, но это ничего не изменило.
Соответствующие части моей установки следующие:
Рабочий каталог
***/docker/
airflow/
logs/
scheduler/
...
2018-01-30/
latest -> /usr/local/airflow/logs/scheduler/2018-01-30
.dockerignore
Dockerfile
...
docker-compose.yml
...
докер-compose.yml
version: '2'
services:
...
airflow:
...
build:
dockerfile: airflow/Dockerfile
context: .
environment:
- LOAD_EX=n
- EXECUTOR=Local
volumes:
- ./airflow/logs:/usr/local/airflow/logs/
...
Докерфайл
FROM puckel/docker-airflow:1.8.1
USER root
...
RUN chown -R airflow: /usr/local/airflow
USER airflow
...
.dockerignore
./logs
...
Ошибка, которую я получаю в терминале:
$ pwd
/***/docker
$ docker-compose build
Building airflow
Traceback (most recent call last):
File "/usr/local/bin/docker-compose", line 11, in <module>
sys.exit(main())
File "/usr/local/lib/python2.7/dist-packages/compose/cli/main.py", line 71, in main
command()
File "/usr/local/lib/python2.7/dist-packages/compose/cli/main.py", line 124, in perform_command
handler(command, command_options)
File "/usr/local/lib/python2.7/dist-packages/compose/cli/main.py", line 254, in build
build_args=build_args)
File "/usr/local/lib/python2.7/dist-packages/compose/project.py", line 364, in build
service.build(no_cache, pull, force_rm, memory, build_args)
File "/usr/local/lib/python2.7/dist-packages/compose/service.py", line 967, in build
'memory': parse_bytes(memory) if memory else None
File "/usr/local/lib/python2.7/dist-packages/docker/api/build.py", line 150, in build
path, exclude=exclude, dockerfile=dockerfile, gzip=gzip
File "/usr/local/lib/python2.7/dist-packages/docker/utils/build.py", line 14, in tar
root=root, fileobj=fileobj, gzip=gzip
File "/usr/local/lib/python2.7/dist-packages/docker/utils/utils.py", line 103, in create_archive
'Can not access file in context: {}'.format(full_path)
IOError: Can not access file in context: /***/docker/airflow/logs/scheduler/latest
Если я удалю содержимое airflow/logs/
перед запуском docker-compose build
, все будет работать, и воздушный поток снова создаст ту же ссылку, и мне придется продолжать ее удалять.
Я бы хотел, чтобы docker-compose полностью игнорировал каталог airflow/logs
. И в идеале, на хосте, чтобы не было воздушного потока ссылки на файловую систему, созданного внутри контейнера.
EDIT в ответ на мой вопрос, помеченный как потенциальный дубликат Смонтировать каталог хоста с символической ссылкой внутри в контейнере docker
- Я не пытаюсь заставить контейнер работать со ссылкой на хосте. Контейнер создает ссылку (хотя я согласен, что основная причина разрыва ссылки на хосте будет одинаковой для обоих вопросов);
- Я не хочу, чтобы ссылка работала как на контейнере, так и на хосте. Мне все равно, что у хоста неработающая символическая ссылка. Я хочу, чтобы эта ссылка или, в идеале, весь каталог
airflow/logs
игнорировался докером; - Я не могу просто создать фиктивный каталог на хосте, чтобы обмануть меня, потому что воздушный поток будет менять цель этой ссылки каждый день;
- Принятый ответ в связанном вопросе не дает решения, все, что он говорит, это «не используйте символические ссылки с целями, у которых будет другой путь на хосте и контейнере». Я не контролирую эту символическую ссылку. Воздушный поток есть.