变量替换无法在Windows 10上使用docker撰写

时间:2016-06-15 04:51:03

标签: docker docker-compose docker-machine

我想知道我是否偶然发现了一个错误,或者说在Windows上与Docker Machine和Compose(已安装的docker版本为1.11.1)中的变量替换没有正确记录的内容。

如果我为yml文件运行“docker-compose up”命令,如下所示:

volumes:
- ${FOOBAR}/build/:/usr/share/nginx/html/

这个变量不存在docker compose会正确地抱怨它:

The foobar variable is not set. Defaulting to a blank string.

但是,当我将其更改为现有环境变量时:

volumes:
- ${PROJECT_DIR}/build/:/usr/share/nginx/html/

然后它将无法正常启动容器并显示以下错误(尝试访问nginx容器将为您提供主机无法访问的消息):

ERROR: for nginx  rpc error: code = 2 desc = "oci runtime error: could not synchronise with container process: not a directory"

如果我在Docker Quickstart终端中运行echo命令,它将输出我在环境变量中设置的正确路径。如果我用环境变量值替换$ {PROJECT_DIR},容器就会正确运行。

如果我尝试使用官方php图像的环境变量而不是官方的nginx图像,我会得到相同类型的错误消息。在这两种情况下,如果我将$ {PROJECT_DIR}文本替换为环境变量的内容,则docker compose文件可以正常工作。

这是一个错误还是我错过了什么?

如果我使用以下内容(包含本地文件的完整路径),我已经设法让容器正确启动而没有错误消息:

volumes:
- ${PROJECT_DIR}:/usr/share/nginx/html/

然后nginx容器启动并运行,但它再也找不到文件了。如果我用它包含的路径替换变量,那么可以再次找到文件。

以上行为不一致。当我添加第二个环境变量进行替换时,它给出了oci运行时错误。当我删除第二个变量并且在我删除了第一个变量时才开始工作时保留给它。之后它突然接受$ {PROJECT_DIR} / build /但仍然没有找到文件。

启动bash会话到nginx容器会显示该卷的挂载点不包含任何文件。

我真的不知道码头正在做什么以及它对我的期望。特别是因为我不知道它是在扩展compose文件中的变量。

1 个答案:

答案 0 :(得分:1)

最后,结论是变量替换在Windows上过于古怪,Docker Machine很有用。但是,有一种替代变量替代。

如果您需要具有以下功能的泊坞窗环境:

  1. 可以部署在不运行相同操作系统的不同计算机上
  2. 不关心主机本地使用Docker还是通过Virtual Box(这可能需要更改路径)
  3. 然后你最好的选择是使用延伸。

    首先,创建包含您需要的图像的docker-compose.yml文件。例如,带有MySQL的php图像:

    dotnet publish

    您可能会注意到此docker-compose文件中没有定义任何卷。这是我们要在名为docker-compose.override.yml的文件中定义的内容:

    php:
      image: 5.5-apache
      links:
        - php_db:mysql
        - maildev:maildev
      ports:
        - 8080:80
    php_db:
      image: mariadb
      ports:
        - 3306:3306
      environment:
        MYSQL_ROOT_PASSWORD: examplepass
    

    当你在一个目录中有两个文件时,docker-compose会做一些有趣的事情。它将它们组合成docker-compose.yml中的一个添加/覆盖设置,以及docker-compose.override.yml中的设置。

    然后在运行命令php: volumes: - /workspaces/Eclipse/project/:/var/www/html/ 时,它将导致为您正在处理的计算机配置的泊坞窗运行。

    如果您在docker-compose命令中更改了一些内容,则可以使用自定义文件名获得类似的行为:

    docker-compose up

    细节是docker-compose可以接受多个撰写文件,它会将它们组合成一个。这种情况从左到右发生。

    这两种方法都允许您创建一个基本的撰写文件来配置您需要的容器。然后,您可以覆盖/添加您正在运行docker的特定计算机所需的设置。

    页面Overview of docker-compose CLI详细介绍了这些命令的工作原理。