Сбой сборки Docker-compose из-за созданной контейнером ссылки в томе

У меня есть настройка, в которой воздушный поток работает в контейнере докеров, и его каталог журналов сопоставлен с каталогом на хосте. Во время работы он создает ссылку на файловую систему /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 игнорировался докером;
  • Я не могу просто создать фиктивный каталог на хосте, чтобы обмануть меня, потому что воздушный поток будет менять цель этой ссылки каждый день;
  • Принятый ответ в связанном вопросе не дает решения, все, что он говорит, это «не используйте символические ссылки с целями, у которых будет другой путь на хосте и контейнере». Я не контролирую эту символическую ссылку. Воздушный поток есть.

person Justinas Marozas    schedule 31.01.2018    source источник
comment


Ответы (2)


Ваш .dockerignore может не вступить в силу, поскольку контекст сборки, который вы установили для воздушного потока, — это ., который не является тем же каталогом, где находится ваш файл .dockerignore. Docker compose ищет ваш файл .dockerignore в расположении относительно контекста сборки.

В своем docker-compose.yml попробуйте установить для контекста сборки значение ./airflow, а для файла dockerfile — значение Dockerfile.

airflow:
    ...
    build:
        dockerfile: Dockerfile
        context: ./airflow

Это должно помочь Docker Compose найти ваш файл .dockerignore во время сборки.

person grizzthedj    schedule 05.02.2018

Похоже, ваш файл .dockerignore игнорируется демоном docker. Попробуйте изменить ./logs на ./airflow/logs/**

здесь находится ссылка на документы .dockerignore

person Vishwa    schedule 04.02.2018
comment
Спасибо за Ваш ответ! Однако это не сработало. В этот момент я тоже попробовал **/logs/**/*. Эта символическая ссылка также нарушит работу других служб в docker-compose.yml, если их context сможет до нее добраться. - person Justinas Marozas; 05.02.2018
comment
**/logs/**/* решает вашу проблему? если да, то вы можете попробовать переместить файл .dockerignore на тот же уровень, что и ваш docker-compose.yml. - person Vishwa; 06.02.2018
comment
Наличие .dockerignore на том же уровне, что и docker-compose.yml, помогло. Похоже, это потому, что на него указывает context для службы воздушного потока. - person Justinas Marozas; 06.02.2018
comment
Рад, что это помогло. Когда вы указываете . как контекст, это каталог docker-compose.yaml, так что да, это контекстная вещь - person Vishwa; 07.02.2018