Compose: 文件不允许绑定安装(卷)–仅目录

创建于 2014-08-19  ·  94评论  ·  资料来源: docker/compose

嘿,
尝试挂载单个文件(而不是目录)会引发错误:
无法启动容器bc0f924401841f2ed92c088cb8089cadad2359126b9f6a3ff15b6cb657835fb0:设置安装的命名空间绑定安装安装/etc/eb8/freeIPA/server/etc/krb5.conf到/var/lib/docker/btrfs/subvolumes/bc0f924401841f2ed92c088cb8089cadad2359126b9f6a3ff15b6cb657835fb0/etc/krb5.conf不是一个目录

它在docker中被允许!!!

```服务器:
构建:docker-freeipa
端口:
-“ 2222:22”
-“ 53”
-“ 80:80”
-“ 443:443”
-“ 389:389”
-“ 636:636”
-“ 88:88”
-“ 464:464”
-“ 123:123”

environment:
    PASSWORD:   **************
    FORWARDER:  192.168.***.***

hostname:     freeipa
domainname:   ****.*****

privileged:   true

volumes:
    - /etc/eb8/freeIPA/server/etc/httpd/conf.d/:/etc/httpd/conf.d
    - /etc/eb8/freeIPA/server/etc/httpd/conf/:/etc/httpd/conf
    - /etc/eb8/freeIPA/server/etc/ipa/:/etc/ipa
    - /etc/eb8/freeIPA/server/etc/krb5.conf:/etc/krb5.conf
    - /etc/eb8/freeIPA/server/etc/pki-ca/:/etc/pki-ca
    - /etc/eb8/freeIPA/server/etc/ssh/:/etc/ssh
    - /etc/eb8/freeIPA/server/etc/sssd/:/etc/sssd
    - /etc/eb8/freeIPA/server/root/:/root
    - /etc/eb8/freeIPA/server/var/cache/ipa:/var/cache/ipa
    - /etc/eb8/freeIPA/server/var/lib/dirsrv/:/var/lib/dirsrv
    - /etc/eb8/freeIPA/server/var/lib/ipa-client/:/var/lib/ipa-client
    - /etc/eb8/freeIPA/server/var/lib/ipa/:/var/lib/ipa
    - /etc/eb8/freeIPA/server/var/log/:/var/log

```

arevolumes kinbug

最有用的评论

@thaJeztah

如果要绑定的文件或目录不存在,则在这种情况下,docker无法确定您是否期望文件或目录(如果/usr/src/app/app.conf不存在) (不存在),则docker守护程序会在该位置创建一个目录,并将其绑定安装在容器中。
请注意,我们试图弃用/删除路径的自动创建(并产生一个错误),但这是一个向后不兼容的更改(有些人依赖此行为),因此我们必须保持这种行为。

在尝试了这个用例六个小时之后,现在发现是不可能的,我感到非常沮丧。
考虑到我们可以指定其他安装选项,例如:ro:rw为什么不向卷声明中添加诸如“文件标志”之类的内容?

volumes:
  - "./config.json:/app/config.json:rwf"

当我将容器文件映射到主机文件时,我希望该主机文件将在容器初始化时创建(从容器中复制)。
不幸的是,找到具有直接放置在应用程序根目录中的配置文件的容器是很普遍的,而且显然您不想“整理”整个根目录。 在这种情况下,如果可行,它将特别有用。

所有94条评论

是的,这让我退缩了!

在您fig killfig rm吗? 我怀疑这是一个带有VolumesFrom的Docker错误: https :

在您fig killfig rm吗? 我怀疑这是一个带有VolumesFrom的Docker错误: https :

不,不是真的,

尝试对文件使用卷时出现相同错误...

在以下VFS上不起作用:

Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
Execution Driver: native-0.2
Kernel Version: 3.10.42-xenU-12-e888729-x86_64
Operating System: Ubuntu 14.04 LTS

但是可以在我的个人计算机上正常工作:

$ docker info
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
Execution Driver: native-0.2
Kernel Version: 3.13.0-35-generic
Operating System: Ubuntu 14.04.1 LTS

记录下来,docker版本的输出是相同的,但是我敢肯定它并不重要,因为我记得它在1.2中也能正常工作...

Client version: 1.3.0
Client API version: 1.15
Go version (client): go1.3.3
Git commit (client): c78088f
OS/Arch (client): linux/amd64
Server version: 1.3.0
Server API version: 1.15
Go version (server): go1.3.3
Git commit (server): c78088f

因此,我可以发现的唯一区别是内核版本。 第一个(不起作用)是VFS,第二个是我的计算机。 这是否有助于了解正在发生的事情?

哼,对不起,污染。 简单的错字。 看来我不是第一个被此困扰的人。

如果在主机端不存在的位置(由于输入错误)调用了“ -v”,它将创建一个空目录,并在必要时创建所有父目录。 然后,当它尝试在容器上安装此空目录并且目标位置已经有文件时,它将引发此消息。

我认为不应允许docker在主机端创建目录。 我是否应该删除我之前的评论(以及该评论),以避免污染该主题?

我将加两美分/这个线程。 能够在docker-compose添加单个文件将非常有帮助。 现在,我必须为每个容器有一个单独的目录,但是大多数容器中只有1个或2个文件。 最好将它们全部放在同一个文件夹中,然后单独引用它们。

我认为在执行卷时有时会出现错误-从中包括绑定安装的文件。
我认为这不是今天的问题。

这似乎是一个经常发生的问题。

根据@ md5的参考和其他注释,我可以在以下情况下忠实地重现此行为:

  • CentOS的7
  • Docker 1.5.0(百胜软件包docker-1.5.0-28.el7.centos)
  • 码头工人组成1.1.0

此行为在yum包docker-1.5.0-1.el7不存在。

例:

使用简单的服务声明:

test:
  image: nginx
  ports:
    - "80:80"
  volumes:
    - sites/test.conf:/etc/nginx/conf.d/default.conf

在尝试绑定安装文件而不是目录时, docker-compose会产生以下结果:

docker create_container <- (name=u'webcluster_test_1', image=u'nginx:latest', environment={}, volumes={u'/etc/nginx/conf.d/default.conf': {}}, detach=True, ports=[u'80'])
file exists at %!s(MISSING), can't create volume there

但是,等效的docker run命令将成功:

docker run --name test -d -p "80:80" \
  -v ${PWD}/sites/test.conf:/etc/nginx/conf.d/default.conf \
  nginx

@dayglojesus您似乎正在使用Docker的开发版本。
您能否提供docker version的输出?
您在此处收到的错误消息来自此提交: https :

该提交不在Docker的发行版本中,并且已在master中修复,并且是1.6 RC系列的一部分。

@ cpuguy83它报告这是版本1.5.0,而不是1.6 RC:

Docker version 1.5.0-dev, build fc0329b/1.5.0

这是在CentOS 7 yum仓库中可用的“正式”构建,而对dev仓库没有任何调整。

为什么docker-compose表现出这种行为而docker run没有表现出这种现象? 这是Docker还是docker-compose

让我知道您是否需要更多信息。

@dayglojesus是的,这不是1.5.0-dev的发行版,是在docker 1.5.0被削减后的某个时间构建的。
该错误在发布的Docker版本中不存在。

@ cpuguy83我明白了。 很奇怪,我想知道这个软件包是如何使它成为回购协议的吗? 您是否偶然知道哪个yum软件包与CentOS 7的实际Docker 1.5.0版本相关?

我不确定... ping @ lsm5

@dayglojesus,因此您安装的是经过RHEL编译的dockerhttp :

如果您确实关心其中的内容,请在https://bugzilla.redhat.com上提交错误。 高温超导

为此问题提交了RHEL票证。 https://bugzilla.redhat.com/show_bug.cgi?id=1209625
谢谢@ lsm5。

嗯,在docker 1.5的ubuntu 14.04lts上也有同样的事情

在Linux mint / ubuntu上发生在我身上,文件根本没有挂载(它们应该覆盖容器,但它们不会)

我在etc-localtime上有同样的问题

  • Linux guest.vm 3.13.0-49-通用#81-Ubuntu
  • x86_64 x86_64 x86_64 GNU / Linux
  • 说明:Ubuntu 14.04.2 LTS
  • 发行:14.04
  • 代号:trusty
  • 码头工人1.5版

如果您遇到问题,+ 1就无济于事,特别是因为+1与OP的问题根本无关。

请包括您正在运行的docker comand,您希望看到的内容以及您实际看到的内容。
还包括docker infodocker version
谢谢。

@ cpuguy83好的,这是关于我的情况:

命令:

docker run -d --name webserver -p 80:80 -v ~/www/:/home/site/www/ -v ~/docker/share/apache_logs/:/home/site/logs -v ~/.gitconfig:/home/site/.gitconfig ...

情况:执行该命令之前,主机上不存在〜/ .gitconfig

发生了什么:〜/ .gitconfig被创建为一个目录,由root(而不是当前用户)拥有,并且容器不运行,并显示一条消息,提示无法挂载〜/ .gitconfig(在其目录中使用完整路径)文字,而不是波浪号的缩写)

我希望看到的是:docker应该将〜/ .gitconfig创建为一个空文件,归当前用户所有,并成功启动容器,或者拒绝以更好的错误消息开始并且根本不创建〜/ .gitconfig

码头工人信息:

user<strong i="14">@ubuntu14server</strong>:~$ docker info
Containers: 5
Images: 153
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 163
Execution Driver: native-0.2
Kernel Version: 3.16.0-30-generic
Operating System: Ubuntu 14.04.2 LTS
CPUs: 1
Total Memory: 3.847 GiB
Name: ubuntu14server
ID: D52N:QLNG:UE33:N7F3:LZJP:NCF4:6OUS:COOJ:ISL3:2CRK:ZX3U:L3DW
WARNING: No swap limit support
user<strong i="15">@ubuntu14server</strong>:~$ docker version
Client version: 1.5.0
Client API version: 1.17
Go version (client): go1.4.1
Git commit (client): a8a31ef
OS/Arch (client): linux/amd64
Server version: 1.5.0
Server API version: 1.17
Go version (server): go1.4.1
Git commit (server): a8a31ef

@gggeek这里的问题是我们无法检测到您想要文件(之前已经讨论过)。
在您的启动脚本中,我建议您在docker run命令之前添加touch ~/.gitconfig

:-D那就是我最终要做的。
那么,采用路由2而不创建文件夹怎么办?

@gggeek不幸的是,那艘船已经航行了,将是一个

;-( 那好吧

我有Docker version 1.6.0, build 4749651这个错误

相关问题: https :

我想我发现了一件事可以解决这个问题。 我在AWS上使用最新的docker-compose(1.20)/ docker(1.6.0)。 每次我尝试启动Nginx时都会收到此错误:

Cannot start container e9586e9e936c9b3991283c676bd071abb92a7b6b3bc0b667cf77a68fa4cc9222: [8] System error: mounting into / is prohibited

出于绝望,我查看了nginx Dockerfile,发现它公开了一个卷。 因此,我将此卷添加到了挂载的列表中,突然一切正常!

因此,docker-compose和docker seams之间的区别是卷的默认值是多少。

该问题已解决,但是解决方案是什么?
我们遇到了同样的问题,即无法将文件装载到Docker容器。
Windows上的最新Docker工具箱版本(docker 1.9)
启动容器最终在

Cannot start container XXX: [8] System error: not a directory

与Sascha-Egeria一样,解决方案?

您要报告的问题与此问题不同。 这个问题是较早版本的Docker中的一个错误,该错误已在很久以前修复。

您的问题听起来可能与#2268有关? 如果您可以通过完整输出docker-compose versiondocker infodocker-compose.yml以及您运行的命令来发布该问题,我们也许可以进一步调试问题。

我终于使用Git Bash和命令“ docker-machine ssh [MACHINE]”与Docker一起解决了我的问题。
Windows上的Docker Quickstart Terminal(1.9d)的新外壳确实不好用。

我有同样的问题。
Docker组成:1.5.1
码头工人:1.9.1

nginx:
  image: nginx
  links:
   - web
  volumes:
   - .:/code
   - ./docker/nginx.conf:/etc/nginx/conf.d/default.conf <------
  ports:
   - "80:80"

@ jordi12100如果您正在获取目录,则找不到文件。

在docker 1.9.1中重现,尝试使用server.conf:/etc/server.conf挂载,其中映像中存在文件/etc/server.conf

使用相对路径似乎使docker将主机文件视为文件夹的名称。 由于它是容器中的文件,因此我们无法将文件夹安装到现有文件/etc/server.conf ,因此失败。

使用到server.conf的绝对路径为我解决了docker run -v /absolute/path/to/server.conf:/etc/server.conf ...的问题,而Docker将server.conf视为普通文件。

相对路径必须以.开头,因此请尝试./server.config

没有它,它将被视为命名卷。

我有同样的问题,即使使用.也无法挂载文件。 除非我提供绝对文件路径,否则Docker(或docker-compose?)会将文件视为文件夹。

码头工人:1.9.1
Docker组成:1.5.2

./server.conf:/etc/server.conf与docker-compose工程一起使用。 但是Docker CLI的-v选项抱怨非法路径,仅接受要挂载文件的绝对路径。

@kirisetsz正确; docker-compose接受相对路径(相对于docker-compose.yml文件); Compose将负责将相对路径转换为绝对路径。 使用docker(非compose)时,必须指定绝对路径。 如果您不想输入整个路径,可以使用-v $(pwd)/server.conf:/etc/server.conf

我确认,我也有同样的问题:
Mac OS X.10.11.3
Docker version 1.9.1, build a34a1d5
docker-compose version 1.5.2, build 7240ff3
即使我指定了绝对或相对主机路径,我也有相同的响应:
ERROR: Cannot start container a9ed08a3ee639f61ff2720745011c940a5fff5b9b98bda6a45156a80381c5328: [8] System error: not a directory
仅供参考:

nginx:
  image: nginx
  ports:
    - 8080:80
    - 8443:443
  volumes_from:
    - application
  volumes:
    - ./SCM/Data/Etc/Configuration/nginx.conf:/etc/nginx/conf.d/default.conf:ro
    - ./LOGS/nginx:/var/log/nginx:rw
  links:
    - fpm

我也有这个问题

composer:
    image: php7-composer:latest
    working_dir: /data/application
    volumes:
      - ./.composer/cache:/var/composer/cache:rw
      - ./.composer/auth.json:/var/composer/auth.json:rw

在此示例中,auth.json被创建为主机上的目录,并且应为文件。 如果我首先将auth.json放在主机上,则会抱怨它不是目录。

对于我来说,当我尝试:

数量:
-./docker/default.conf:/etc/nginx/conf.d/default.conf

我收到错误:错误:无法启动容器9f ...... f1e:[9]系统错误:不是目录

如果我将conf.d更改为其他名称,则可以工作,但是它将default.conf挂载为目录而不是文件

Windows 10
码头工人版本:1.10.1
docker-compose版本1.6.0,构建cdb920a

由于此bug没有解决,是可以重新打开吗? 它仍在发生。 我的案例与其他案例一样,都尝试将nginx.conf文件挂载到/etc/nginx/nginx.conf下的nginx映像中。

在docker-compose.yml中:

nginx:
  image: "nginx:1.9.7"
  ports:
    - "80:80"
    - "443:443"
  volumes:
    - "./config/nginx.conf:/etc/nginx/nginx.conf:ro"
    - "./config/development-cert.pem:/etc/nginx/cert.pem:ro"
    - "./config/development-key.pem:/etc/nginx/key.pem:ro"

输出:

$ docker-compose up -d nginx
Starting example_nginx_1
ERROR: Cannot start container 81f4237f3f0e962d8861ca30744bfd78c3b61b4ea5891a19c712c682ecc5142c: [9] System error: not a directory

我正在使用带有VMware Fusion插件(VMware Fusion 8.1.0)和CoreOS主机的Vagrant VM在OS X(10.11.3)上运行Docker。 相关版本信息:

$ vagrant -v
Vagrant 1.8.1

$ vagrant plugin list
vagrant-vmware-fusion (4.0.8)

$ docker-compose -v
docker-compose version 1.6.0, build unknown

$ docker info
Containers: 6
 Running: 5
 Paused: 0
 Stopped: 1
Images: 6
Server Version: 1.10.1
Storage Driver: overlay
 Backing Filesystem: extfs
Execution Driver: native-0.2
Logging Driver: json-file
Plugins:
 Volume: local
 Network: host bridge null
Kernel Version: 4.4.1-coreos
Operating System: CoreOS 970.1.0 (Coeur Rouge)
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 2.391 GiB
Name: localhost
ID: 73NW:JIK2:PTGX:3JVG:JZM4:NON4:DXOD:NAUU:UN7Q:T3F5:ZMZG:UWGR
Username: redacted
Registry: https://index.docker.io/v1/

$ docker version
Client:
 Version:      1.10.1
 API version:  1.22
 Go version:   go1.5.3
 Git commit:   9e83765
 Built:        Fri Feb 12 22:11:40 UTC 2016
 OS/Arch:      darwin/amd64

Server:
 Version:      1.10.1
 API version:  1.22
 Go version:   go1.4.3
 Git commit:   88b8b3a
 Built:
 OS/Arch:      linux/amd64

请在这里查看我的评论: https :

该错误可能看起来相同,但很可能是由其他问题引起的。

另请参阅https://github.com/docker/docker/issues/13670https://github.com/docker/docker/issues/19304。

我还听到了报告,如果您设置的工作目录不存在于目录中,则可以获取此信息。 我相信您遇到了这些问题之一。

我遇到了这个问题,将所有头发拔掉后发现该文件夹是根拥有文件夹的符号链接。

将所有内容移到(我)用户拥有的文件夹中,并且工作正常。

Docker-1.12.0-rc2
Docker机器0.8.0-rc1
Docker-compose 1.8.0-rc1

通过Google找到了该线程。 我也有这个问题。 我无法绑定到单个文件,OSX。

Docker version 1.12.0-rc4, build e4a0dbc, experimental
docker-compose version 1.8.0-rc2, build c72c966

Docker今天才更新。

更新:屏幕快照显示了它试图挂载为目录而不是文件。

screen shot 2016-07-19 at 5 25 35 pm

我有同样的问题:-(无法挂载单个文件

Client:
 Version:      1.12.0-rc4
 API version:  1.24
 Go version:   go1.6.2
 Git commit:   e4a0dbc
 Built:        Wed Jul 13 03:28:51 2016
 OS/Arch:      darwin/amd64
 Experimental: true

Server:
 Version:      1.12.0-rc4
 API version:  1.24
 Go version:   go1.6.2
 Git commit:   e4a0dbc
 Built:        Wed Jul 13 03:28:51 2016
 OS/Arch:      linux/amd64
 Experimental: true

也确认问题

OSX的今天更新已修复该问题。 我能够使用docker-compose成功挂载单个文件。

Docker version 1.12.0, build 8eab29e, experimental
docker-compose version 1.8.0, build f3628c7

尝试使用docker-compose挂载文件

// docker-compose.yml
version: '2'
services:
  web:
    build: .
    privileged: true
    volumes:
      - "/usr/src/app/app.conf:/etc/app.conf"
    entrypoint: /run.sh

在主机上

ls /usr/src/app/ -la
total 12
drwxr-xr-x   3 root root 4096 Aug  9 11:08 .
drwxr-xr-x 101 root root 4096 Aug  8 14:16 ..
drwxr-xr-x   2 root root 4096 Aug  9 11:08 app.conf

Docker-compose创建了一个目录:drwxr-xr-x app.conf
而不是文件。

这是正常行为吗? 我认为该文件将被创建和挂载。

如果有人给我澄清,我将不胜感激。

# lsb_release -a
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.1 LTS
Release:        16.04
Codename:       xenial

Docker version 1.12.0, build 8eab29e
docker-compose version 1.8.0, build f3628c7

@bogulean如果您要绑定的文件或目录不存在,则在这种情况下,docker无法确定您期望的是_file_还是_directory_(如果/usr/src/app/app.conf不存在)存在),则docker守护程序会在该位置创建一个目录,并将其绑定安装在容器中。

请注意,我们试图弃用/删除路径的自动创建(并产生一个错误),但这是一个向后不兼容的更改(有些人依赖此行为),因此我们必须保持这种行为。

@thaJeztah感谢您的快速回复!
我尝试在启动docker-compose之前手动创建文件“ /usr/src/app/app.conf”,结果如下:

ERROR: for web  Cannot start service web: oci runtime error: rootfs_linux.go:53: mounting "/var/lib/docker/aufs/mnt/dc65b60b56bae344412f8c23a35f6a19d897b0cad0673bcb9316267ed02a44fe/etc/app.conf" to rootfs "/var/lib/docker/aufs/mnt/dc65b60b56bae344412f8c23a35f6a19d897b0cad0673bcb9316267ed02a44fe" caused "not a directory"
ERROR: Encountered errors while bringing up the project.

@bogulean您的设置是什么? 守护程序和客户端是否都在同一台计算机上运行,​​或者您正在使用远程守护程序(或在虚拟机中运行的守护程序?)

@thaJeztah我正在使用DO主机,Ubuntu 16.04 LTS,
docker-compose和docker安装在上面,请在下面找到版本:

# lsb_release -a
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.1 LTS
Release:        16.04
Codename:       xenial

Docker version 1.12.0, build 8eab29e
docker-compose version 1.8.0, build f3628c7

一切都在这台机器上运行到我用ssh连接

尝试使docker compose脱离方程式,您可以尝试重现吗?

docker run --rm -v /usr/src/app/app.conf:/test/app.conf alpine cat /test/app.conf

应该绑定安装配置文件并打印其内容

docker run -it --rm -v /usr/src/app/app.conf:/test/app.conf alpine sh -c 'cat /test/app.conf'
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
e110a4a17941: Pull complete
Digest: sha256:3dcdb92d7432d56604d4545cbd324b14e647b313626d99b889d0626de158f73a
Status: Downloaded newer image for alpine:latest
Hello from /usr/src/app/app.conf

@thaJeztah如果您出于测试目的将其提供给我,我也可以运行一些docker-compose.yml

@bogulean对,所以看起来与

version: '2'
services:
  web:
    image: "alpine:latest"
    volumes:
      - "/usr/src/app/app.conf:/test/app.conf"
    command: "cat /test/app.conf"

并尝试是否可行;

docker-compose run web

(还应打印Hello from /usr/src/app/app.conf

@thaJeztah ,非常感谢! 您的docker-compose.yml返回了Hello from /usr/src/app/app.conf
这样一来,我意识到自己在另一个地方做错了,我发现Dockerfile中有一行:
VOLUME ["/usr/src/app.conf"]
删除它,文件开始按预期进行绑定。

谢谢你的时间。

很高兴听到,乐于助人!

您遇到的问题是VOLUME还需要一个目录,因此创建了一个卷,并尝试将其挂载到/usr/src/app.conf 。 处理来自主机的单个文件的最佳方法通常是考虑这种情况,例如,通过具有/usr/src/config/目录; 然后,您应该将该目录而不是文件绑定安装(或使用卷)。 显然,并非总是可能

@thaJeztah ,运行此程序时遇到相同的问题:

docker run -v $(pwd)/filebeat.yml:/filebeat.yml prima/filebeat:1.2 cat filebeat.yml
cat: filebeat.yml: Is a directory

/肯定存在于图像/容器中:

docker run -v $(pwd)/filebeat.yml:/filebeat.yml prima/filebeat:1.2 ls -al
drwxr-xr-x   2 root root   40 Aug  9 20:46 filebeat.yml

似乎一般是Docker错误,与Docker Compose无关。
不知道为什么在这种情况下Docker为什么会创建目录。

有任何想法吗? 非常感谢!

我还尝试了使用高山图片的示例。 相同。 cat: read error: Is a directory

@thasmo您会收到此错误,因为filebeat.yml是目录,而不是文件。
在尝试将文件挂载到容器之前,必须确保文件在主机上存在,否则docker将为您创建一个目录。

@ cpuguy83 ,我想我才发现问题。 我在Windows上通过Docker Machine和VirtualBox使用Docker,它可能无法通过VirtualBox将本地文件挂载到容器中。
https://docs.docker.com/docker-for-windows/问题排查/#

我在Windows 10周年更新上的全新安装docker上发现了该问题。
其实这个问题很简单的解决方法

需要在Docker选项中共享驱动器http://www.awesomescreenshot.com/image/1510321/0f1a81d7a8883df5a61bcdf04b3994cf
看起来找到并解决问题。

在Ubuntu 16.10上仍然存在问题

➜  gi_proxy git:(master) ✗ docker -v
Docker version 1.12.3, build 6b644ec

泊坞窗运行--name hap ... -v /home/cverbinnen/src/unisporkal/gi_proxy/dev-resolv.conf:/etc/resolv.conf

docker: Error response from daemon: invalid header field value "oci runtime error: container_linux.go:247: starting container process caused \"process_linux.go:359: container init caused \\\"rootfs_linux.go:53: mounting \\\\\\\"/home/cverbinnen/src/unisporkal/gi_proxy/dev-resolv.conf\\\\\\\" to rootfs \\\\\\\"/mnt/sda1/var/lib/docker/aufs/mnt/34ee49dcff906310df08b5a0bdf02ebafd302c1c7bf8b81ecd2778757fdb5713\\\\\\\" at \\\\\\\"/mnt/sda1/var/lib/docker/aufs/mnt/34ee49dcff906310df08b5a0bdf02ebafd302c1c7bf8b81ecd2778757fdb5713/etc/resolv.conf\\\\\\\" caused \\\\\\\"not a directory\\\\\\\"\\\"\"\n".

如果我将docker run更改为挂载到/ tmp / foo之类的不存在的文件,则可以工作,但会挂载目录。

@djpate是您的/home/cverbinnen/src/unisporkal/gi_proxy/dev-resolv.conf ,则该守护程序将创建一个具有该名称的_directory_,并尝试将其绑定安装在容器中的/etc/resolv.conf内。 由于/etc/resolv.conf是_file_,因此将目录绑定安装到文件顶部将失败。

话虽如此,我强烈不建议在本地文件中覆盖/etc/resolv.conf/etc/resolv.conf由docker管理,以设置要使用的正确DNS服务器。 Docker具有用于服务发现的嵌入式DNS服务器,因此覆盖该文件将导致服务发现不起作用。

如果你想设置DNS选项,使用--dns--dns-opt--dns-search上的选项docker run ;

--dns value                   Set custom DNS servers (default [])
--dns-opt value               Set DNS options (default [])
--dns-search value            Set custom DNS search domains (default [])

这将设置这些选项而不会导致意外的结果。 请注意,容器内的DNS始终为127.0.0.11 (嵌入式DNS服务器),但是该服务器会自动将请求转发到您使用--dns指定的DNS服务器

@thaJeztah我是

我将像您提到的那样将其更改为DNS选项,我对此并不了解。 谢谢! 但是我认为该错误仍然存​​在。

在docker-compose v1.6.2和docker v1.10.2上,这对我都不起作用:(

使用绝对路径的作品,但不幸的是,我使用的情况下,绝对路径绝对不会工作:(。我尝试过的每个组合./../ ,我能想到的。

编辑:另外,我在没有VM的Linux上运行,所以@thaJeztah解决方案对我不起作用

操作系统是Ubuntu 14.04

Docker现在达到1.13.1。 请升级您的Docker。 从1.12.x开始,它一直在工作。

嗯谢谢将会升级docker&更新/如果/固定的话:)

编辑:工作! 谢谢@guice

@thaJeztah

如果要绑定的文件或目录不存在,则在这种情况下,docker无法确定您是否期望文件或目录(如果/usr/src/app/app.conf不存在) (不存在),则docker守护程序会在该位置创建一个目录,并将其绑定安装在容器中。
请注意,我们试图弃用/删除路径的自动创建(并产生一个错误),但这是一个向后不兼容的更改(有些人依赖此行为),因此我们必须保持这种行为。

在尝试了这个用例六个小时之后,现在发现是不可能的,我感到非常沮丧。
考虑到我们可以指定其他安装选项,例如:ro:rw为什么不向卷声明中添加诸如“文件标志”之类的内容?

volumes:
  - "./config.json:/app/config.json:rwf"

当我将容器文件映射到主机文件时,我希望该主机文件将在容器初始化时创建(从容器中复制)。
不幸的是,找到具有直接放置在应用程序根目录中的配置文件的容器是很普遍的,而且显然您不想“整理”整个根目录。 在这种情况下,如果可行,它将特别有用。

@malyzeli,您可能希望将秘密视为注入这样的配置或在启动时进行模版的一种方式。
卷实际上是为持久性而不是配置而设计的。
确实,码头工人根本不应该自动创建主机路径,并且此行为已在较新的API上删除。

@ cpuguy83

我不明白你的意思,所以请解释或纠正我的假设,因为我对Docker生态系统还很陌生。

您可能希望将机密视为注入这样的配置或在启动时进行模版的一种方式。

如果我不知道配置文件的样子,因为它是由某些安装向导直接从应用程序中创建的(最终会因版本而异)怎么办?
许多应用程序都具有这种首次设置,例如Limesurvey和NodeBB。

卷实际上是为持久性而不是配置而设计的。

您是在暗示现有容器的配置不应该持久吗?
那么,如果我要备份多容器基础架构的某些部分怎么办?
我想在卷中同时包含数据和配置,以便在发生错误时可以快速还原它。

确实,码头工人根本不应该自动创建主机路径,并且此行为已在较新的API上删除。

实际上,我不需要它来创建主机路径,而是使用现有的图像数据来初始化给定的卷(例如,“外部化”一些html模板,我希望它们可以从主机系统和/或其他容器中进行编辑),并且它仍然完全按照Dockerfile参考中所述工作

docker run命令使用基本映像内指定位置上存在的任何数据初始化新创建的卷。

如果我不知道配置文件的样子,因为它是由某些安装向导直接从应用程序中创建的(最终会因版本而异)怎么办?

创建它,从图像/容器中提取它,从中秘密

我想在卷中同时包含数据和配置,以便在发生错误时可以快速还原它。

使用机密。 我们还在寻找一个专用的config对象,该对象与机密相似,但并不仅限于此...但是今天,机密才是可用的。

实际上,我不需要它来创建主机路径,而是使用现有的图像数据来初始化给定的卷(例如,“外部化”一些html模板,我希望它们可以从主机系统和/或其他容器中进行编辑),并且它仍然完全按照Dockerfile参考中所述运行:

绑定安装不是卷。 Dockerfile参考正在讨论卷。 不幸的是,两者都使用了docker run -v

我绝对不是在说不要使用卷来存储配置,而是要评估是否有更好的解决方案(而IMO机密对此要好得多)。

主机绑定是一种糟糕的解决方案,除了获取主机上预先存在的内容并将其放入容器...之外,甚至在谈论集群环境时,通常也不可行。

@ cpuguy83

创建它,从图像/容器中提取它,从中秘密

是的,那是我要做的,但是无论如何,它似乎很烦人.. :-)

使用机密。 我们还在寻找一个专用的config对象,该对象与机密相似,但并不仅限于此...但是今天,机密才是可用的。

我会调查一下,不知道秘密,谢谢!

绑定安装不是卷。 Dockerfile参考正在讨论卷。 不幸的是,两者都使用了docker run -v

好的,这似乎解释了为什么它没有按我预期的那样工作。 考虑到它是通过相同的-v参数完成的,所以我认为绑定和卷是同一事物的不同命名。

对于那些在Windows中看到此错误的人...即使您已共享驱动器...

存在一个问题,如果您使用Docker Windows(带有docker-compose)并使用某些凭据来“共享驱动器”,例如C:\或D:\等,则可能必须取消共享,再次共享驱动器,然后重新输入凭据,否则会给您一个错误,例如:

“错误:for ...无法启动服务yourservice:oci运行时错误:container_linux.go:262:启动容器进程导致“ process_linux.go:339:container”导致\“ rootfs_linux.go:57:安装\

“ \\”导致\\“不是目录\\”“”
:您是否正在尝试将目录挂载到文件上(反之亦然)? 检查指定的主机路径是否存在并且是预期的类型”

BaranOrnarli如何成为拥有DockerToolbox的人?

与这里的大多数人一样,这里存在同样的问题。 但是我只是通过重新启动VM再次使其工作。

Windows 10教育版
Docker工具箱,17.10.0-ce
VirtualBox 5.2.2

通过docker CLI运行此命令可以正常工作
docker run -d -p 8080:80 -v $(pwd)/src/vhost.conf:/etc/nginx/sites-enabled/vhost.conf教程/ nginx

通过docker-compose运行相同,没有:
剪断
volumes: - ./src/vhost.conf:/etc/nginx/sites-enabled/vhost.conf
也就是说,直到我通过VirtualBox GUI关闭VM并再次启动Docker Quickstart Terminal。

从那时起,反复破坏容器并进行docker-compose并没有使错误再次出现。

希望这对某人有帮助。

我也有同样的问题。 同时,我在docker-compose.yml中使用真实卷docker文件夹。 这是/var/lib/docker/volumes..../file.ext作为临时解决方法
(Docker版本17.12.0-ce,内部版本c97c6d6)

如果遇到此类问题,请检查是否在Windows上共享了目录。

我在Ubuntu 14.04上。 当我运行docker-compose up -d命令时,出现以下错误:

ERROR: for frontend Cannot start service frontend: OCI runtime create failed: container_linux.go:296: starting container process caused "process_linux.go:398: container init caused \"rootfs_linux.go:58: mounting \\\"/home/curso-docker/email-worker-compose/nginx/default.conf\\\" to rootfs \\\"/var/lib/docker/aufs/mnt/ffc214cd493c376554125473ba95e8cd918cd3ad73b6aa8292f51ce84beca8a6\\\" at \\\"/var/lib/docker/aufs/mnt/ffc214cd493c376554125473ba95e8cd918cd3ad73b6aa8292f51ce84beca8a6/etc/nginx/conf.d/default.conf\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type

我正在使用绝对路径从主机映射卷/home/curso-docker/email-worker-compose/nginx/default.conf

有人对这个问题有想法吗?

@AzeredoGabriel对我来说,做@BaranOrnarli之前提到的事情就像一个魅力一样。 重置您的共享驱动器的凭据,再次共享它,它应该可以工作。 不知道为什么它突然突然停止工作,但现在又是。

有什么消息吗? 似乎无法挂载单个文件

@Karlheinzniebuhr这从来没有问题。 Docker允许将文件装载到容器中,但是您不能将文件装载到目录中,反之亦然。

有什么消息吗? 似乎无法挂载单个文件

尝试将文件映射到现有目录。 如果不存在,Docker总是尝试创建目录。

@ cpuguy83当然是个问题。 我们不是试图将文件挂载到目录中。 我们正在尝试将容器创建的单个文件作为文件挂载到主机。

我们可以重新打开这个问题吗? 截至2019年仍无法正常工作。在最新的Docker和最新的Debian上运行的最新docker-compose上。

您不能从容器安装到主机,只能采用其他方法。
目录和文件的行为相同。

使用docker 19.03.1和docker-compose 1.24.1的同一问题,同时尝试通过docker-compose.yml中的卷绑定覆盖store/elastic/filebeat:7.3.0映像中的配置文件:

    volumes:
      - ${PWD}/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro

ERROR: for docker_filebeat_1 Cannot start service filebeat: OCI runtime create failed: container_linux.go:345: starting container process caused "process_linux.go:430: container init caused \"rootfs_linux.go:58: mounting \\\"/filebeat.yml\\\" to rootfs \\\"/var/lib/docker/overlay2/f49a0ae0ec6646c818dcf05dbcbbdd79fc7c42561f3684fbb1fc5d2b9d3ad192/merged\\\" at \\\"/var/lib/docker/overlay2/f49a0ae0ec6646c818dcf05dbcbbdd79fc7c42561f3684fbb1fc5d2b9d3ad192/merged/usr/share/filebeat/filebeat.yml\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type

最初,我尝试使用“配置”,但发现此功能仅适用于群体。
我正在尝试找到一种方法来将配置文件提供给默认映像,而不用COPY配置文件创建自定义文件。

同一期

$ ls -l logstash.conf
-rw-r--r--  1 lubumbax  staff  164 Apr 30 18:01 logstash.conf
$ pwd
/Users/lubumbax/Src/Java/elk
$ docker run -it --name logstash -p 5000:5000 \
             -v "$(pwd)/logstash.conf:/usr/share/logstash/pipeline/logstash.conf" \
             docker.elastic.co/logstash/logstash:7.6.2

结果:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"rootfs_linux.go:58: mounting \\\"/Users/lubumbax/Src/Java/elk/logstash.conf\\\" to rootfs \\\"/var/lib/docker/overlay2/bad85f1a2984bed23619fdf401cc9655573bb1799a8b681d371f5964201b9a82/merged\\\" at \\\"/var/lib/docker/overlay2/bad85f1a2984bed23619fdf401cc9655573bb1799a8b681d371f5964201b9a82/merged/usr/share/logstash/pipeline/logstash.conf\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.

$ docker version
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.14
 Git commit:        afacb8b
 Built:             Thu Mar 12 02:45:41 2020
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b7f0
  Built:            Wed Mar 11 01:30:32 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

有机会解决这个问题吗?

烦人的问题。

同事们,在docker-compose中检查安装方向。
我遇到了同样的问题,直到意识到自己错了,应该这样:

...
    volumes:
      - /host/file:/docker/file:ro
...
此页面是否有帮助?
0 / 5 - 0 等级