变量替换不适用于 Windows 10 with docker compose

Variable substitution not working on Windows 10 with docker compose

我想知道我是否偶然发现了一个错误,或者关于 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 快速启动终端中使用 echo 命令,它将输出我在环境变量中设置的正确路径。如果我用环境变量值替换 ${PROJECT_DIR} 容器 运行s 正确。

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

这是错误还是我遗漏了什么?


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

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

nginx 容器随后启动并 运行ning,但它无法再找到文件。如果我用它包含的路径替换变量然后可以再次找到文件。


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

启动与 nginx 容器的 bash 会话显示卷的安装点不包含任何文件。

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

最后的结论是,变量替换在 Windows 和 Docker 机器上太古怪了,没有用。但是,有一种替代变量替换的方法。

如果您需要执行以下操作的 docker 环境:

  1. 可以部署在 运行 不同的计算机上 OS
  2. 不关心主机是本地使用 Docker 还是通过 Virtual Box(这可能需要更改路径)

那么最好的办法就是使用扩展。

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

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.override.yml:

的文件中定义的内容
php:
  volumes:
     - /workspaces/Eclipse/project/:/var/www/html/

当您将两个文件都放在一个目录中时 docker-compose 会做一些有趣的事情。它将它们合并为 docker-compose.yml 中的一个 adding/overwriting 设置和 docker-compose.override.yml.

中的设置

然后当 运行 执行命令 docker-compose up 时,它会生成一个 docker 运行,它是为您正在使用的机器配置的。

如果您在 docker-compose 命令中进行一些更改,您可以获得与自定义文件名类似的行为:

docker-compose -f docker-compose.yml -f docker-compose.conf.yml up

细节是 docker-compose 可以接受多个撰写文件,并将它们合并为一个。这是从左到右发生的。

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

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