在“Docker-compose up”命令中,主机卷未被挂载。

5
我正在使用docker-machine和docker-compose开发具有React前端的Django应用程序。在Debian环境中,卷无法挂载,但在OSX和Windows上可以正常工作。我已经为此问题苦苦挣扎了几天,我创建了一个轻量级版本的项目,仍然复制了这个问题,您可以在https://github.com/firetix/docker_bug找到它。 我的docker-compose.yml:
django:
    build: django
    volumes:
        - ./django/:/home/docker/django/

我的 Dockerfile 如下:
FROM python:2.7
RUN mkdir -p /home/docker/django/
ADD . /home/docker/django/
WORKDIR /home/docker/django/
CMD ["./command.sh"]

当我运行docker-compose build时,所有东西都正常工作。但是当我运行docker-compose up时,我遇到了问题。
[8] System error: exec: "./command.sh": stat ./command.sh: no such file or directory

我在stackoverflow上发现了这个问题如何在docker机器中挂载本地卷,按照提出的解决方法进行操作但没有成功。

我错在哪里了?为什么这在osx和windows上可以工作,但在Debian环境下不行?是否有任何在Debian环境下可行的解决方法?当我检查VirtualBox GUI时,Osx和Debian都有/Users/文件夹作为共享文件夹。


我发现了一个相关的 Github 问题,链接如下 https://github.com/docker/machine/issues/179 - Rachidi Mohamed
2个回答

1

这在OSX上甚至Debian上都不能正常工作,原因如下:

当您将./command.sh添加到卷/home/docker/django/django/中时,镜像可以正常构建,并且文件位于正确的目录中。但是,当您up容器时,您会将本地目录“覆盖”在镜像中创建的目录上。因此,那里不再有任何东西......

我建议将command.sh添加到其他位置,例如/opt/django/,并将您的docker命令更改为./opt/command.sh

或者更简单点,可以像这样做,以下是完整代码:

# Dockerfile
FROM python:2.7
RUN mkdir -p /home/docker/django/
WORKDIR /home/docker/django/

# docker-compose.yml
django:
    build: django
    command: ./command.sh
    volumes:
        - ./django/:/home/docker/django/

不确定这是否正确,我刚在OSX El Capitan Docker v 1.9.0、docker-compose 1.5.0上进行了测试,因为“覆盖”式挂载应该会用本地文件command.sh覆盖,而不是挂载一个空卷。在OSX上它确实覆盖了该文件,但在Debian上我仍然得到了错误信息:找不到文件command.sh。我还尝试将command.sh移动到未被挂载的文件夹/opt/中,但仍然遇到了同样的问题。@Brandon感谢您的回答! - Rachidi Mohamed
据我所知,直接主机卷必须以绝对方式编写(可以使用${PWD}环境变量来实现)。 - BlackStork

0

我相信这应该可以解决问题。使用相对路径的docker-compose版本存在一些问题。

 django:
   build: django
   volumes:
     - ${PWD}/django:/home/docker/django

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接