变量替换不适用于 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 环境:
- 可以部署在 运行 不同的计算机上 OS
- 不关心主机是本地使用 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 详细介绍了这些命令的工作原理。
我想知道我是否偶然发现了一个错误,或者关于 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 环境:
- 可以部署在 运行 不同的计算机上 OS
- 不关心主机是本地使用 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 详细介绍了这些命令的工作原理。