Docker-compose 构建失败,因为容器在卷中创建 link
Docker-compose build fails because of container-created link in a volume
我有一个设置,其中气流在 docker 容器中 运行,并将其日志目录映射到主机中的目录。虽然 运行,但它会创建一个文件系统 link /usr/local/airflow/logs/scheduler/latest
,该文件系统在容器内有一个有效目标,但在主机中没有。下一次 运行 docker-compose build
它在那个 link 上绊倒并且构建失败。
我试过忽略 .dockerignore 中的日志目录,但这并没有改变任何东西。
我设置的相关部分如下:
工作目录
***/docker/
airflow/
logs/
scheduler/
...
2018-01-30/
latest -> /usr/local/airflow/logs/scheduler/2018-01-30
.dockerignore
Dockerfile
...
docker-compose.yml
...
docker-compose.yml
version: '2'
services:
...
airflow:
...
build:
dockerfile: airflow/Dockerfile
context: .
environment:
- LOAD_EX=n
- EXECUTOR=Local
volumes:
- ./airflow/logs:/usr/local/airflow/logs/
...
Docker 文件
FROM puckel/docker-airflow:1.8.1
USER root
...
RUN chown -R airflow: /usr/local/airflow
USER airflow
...
.docker忽略
./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
如果我在 运行 docker-compose build
之前删除 airflow/logs/
的内容一切正常并且气流再次创建相同的 link 我必须继续删除它。
我希望 docker-compose 完全忽略 airflow/logs
目录。理想情况下,在主机中,不要从容器内部创建文件系统 link 气流。
EDIT 回应我的问题被标记为
的潜在重复项
- 我并不是要让容器与主机中的 link 一起工作。容器创建 link(尽管我同意 link 在主机中被破坏的根本原因对于两个问题都是相同的);
- 我不希望 link 同时在容器和主机上工作。我真的不在乎主机有一个损坏的 symlink。我希望 link,或者最好是整个
airflow/logs
目录被 docker; 忽略
- 我不能只在主机上创建一个虚拟目录来欺骗我,因为气流每天都会改变 link 的目标;
- linked 问题中接受的答案并没有给出解决方案,它只是说 "don't use symlinks with targets that would have different path on host and container"。我无法控制那个 symlink。气流是。
您的 .dockerignore 文件似乎被 docker 守护进程忽略了。尝试将 ./logs 更改为 ./airflow/logs/**
here 是 link 到 .docker忽略文档
您的 .dockerignore
可能没有生效,因为您为 airflow 设置的构建上下文是 .
,它与您的 .dockerignore
文件所在的目录不同。 Docker compose 正在相对于构建上下文的位置寻找您的 .dockerignore
文件。
在您的 docker-compose.yml
中,尝试将构建上下文设置为 ./airflow
并将 dockerfile 设置为 Dockerfile
。
airflow:
...
build:
dockerfile: Dockerfile
context: ./airflow
这应该有助于 Docker Compose 在构建时找到您的 .dockerignore
文件。
我有一个设置,其中气流在 docker 容器中 运行,并将其日志目录映射到主机中的目录。虽然 运行,但它会创建一个文件系统 link /usr/local/airflow/logs/scheduler/latest
,该文件系统在容器内有一个有效目标,但在主机中没有。下一次 运行 docker-compose build
它在那个 link 上绊倒并且构建失败。
我试过忽略 .dockerignore 中的日志目录,但这并没有改变任何东西。
我设置的相关部分如下:
工作目录
***/docker/
airflow/
logs/
scheduler/
...
2018-01-30/
latest -> /usr/local/airflow/logs/scheduler/2018-01-30
.dockerignore
Dockerfile
...
docker-compose.yml
...
docker-compose.yml
version: '2'
services:
...
airflow:
...
build:
dockerfile: airflow/Dockerfile
context: .
environment:
- LOAD_EX=n
- EXECUTOR=Local
volumes:
- ./airflow/logs:/usr/local/airflow/logs/
...
Docker 文件
FROM puckel/docker-airflow:1.8.1
USER root
...
RUN chown -R airflow: /usr/local/airflow
USER airflow
...
.docker忽略
./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
如果我在 运行 docker-compose build
之前删除 airflow/logs/
的内容一切正常并且气流再次创建相同的 link 我必须继续删除它。
我希望 docker-compose 完全忽略 airflow/logs
目录。理想情况下,在主机中,不要从容器内部创建文件系统 link 气流。
EDIT 回应我的问题被标记为
- 我并不是要让容器与主机中的 link 一起工作。容器创建 link(尽管我同意 link 在主机中被破坏的根本原因对于两个问题都是相同的);
- 我不希望 link 同时在容器和主机上工作。我真的不在乎主机有一个损坏的 symlink。我希望 link,或者最好是整个
airflow/logs
目录被 docker; 忽略
- 我不能只在主机上创建一个虚拟目录来欺骗我,因为气流每天都会改变 link 的目标;
- linked 问题中接受的答案并没有给出解决方案,它只是说 "don't use symlinks with targets that would have different path on host and container"。我无法控制那个 symlink。气流是。
您的 .dockerignore 文件似乎被 docker 守护进程忽略了。尝试将 ./logs 更改为 ./airflow/logs/**
here 是 link 到 .docker忽略文档
您的 .dockerignore
可能没有生效,因为您为 airflow 设置的构建上下文是 .
,它与您的 .dockerignore
文件所在的目录不同。 Docker compose 正在相对于构建上下文的位置寻找您的 .dockerignore
文件。
在您的 docker-compose.yml
中,尝试将构建上下文设置为 ./airflow
并将 dockerfile 设置为 Dockerfile
。
airflow:
...
build:
dockerfile: Dockerfile
context: ./airflow
这应该有助于 Docker Compose 在构建时找到您的 .dockerignore
文件。