来自外部配置的多个绑定挂载
Multiple binds mounts from external config
我正在整理一些工具,这些工具需要访问分布在主机上不同位置的配置。
由于我无法控制的原因,不同的主机有不同的映射,所以我需要绑定挂载。
是否可以外部化挂载配置,以便我们可以为每个主机动态生成它?
我看过 docker-compose 使用 JSON 的示例,但找不到任何 docker 运行 等效项(docker-compose 是'不是我的用例的选项)。
我尝试了以下方法:
container-env.json:
{
"mounts" : [
"type=bind,source=//c/Users/foo/.ssh,target=/root/.ssh,ro",
"type=bind,source=//c/Users/foo/Projects/ops-tools,target=/root/ops-tools",
"type=bind,source=//c/tmp/certs,target=/root/certs"
]
}
docker run --env-file container-env.json...
但是 docker 抱怨错误“poorly formatted environment: variable '"mounts" : [' contains whitespaces.
”,删除空格会抑制错误,但没有安装任何内容
您不能为此使用 --env-file
- 那仅适用于环境变量。
我不知道有什么方法可以在 Docker 本地执行此操作,但您可以使用 Bash 和 jq 一起破解一些东西。这是一个将 JSON 文件转换为一系列挂载选项的命令:
< container-env.json jq -r '.mounts | map("--mount \"" + . + "\"") | join("\n")'
产生这个输出:
--mount "type=bind,source=//c/Users/foo/.ssh,target=/root/.ssh,ro"
--mount "type=bind,source=//c/Users/foo/Projects/ops-tools,target=/root/ops-tools"
--mount "type=bind,source=//c/tmp/certs,target=/root/certs"
以下是您在脚本中的使用方法。
#!/usr/bin/env bash
mount_options="$(< container-env.json jq -r '.mounts | map("--mount \"" + . + "\"") | join("\n")')"
docker run $mount_options <rest of command goes here>
我正在整理一些工具,这些工具需要访问分布在主机上不同位置的配置。
由于我无法控制的原因,不同的主机有不同的映射,所以我需要绑定挂载。
是否可以外部化挂载配置,以便我们可以为每个主机动态生成它?
我看过 docker-compose 使用 JSON 的示例,但找不到任何 docker 运行 等效项(docker-compose 是'不是我的用例的选项)。
我尝试了以下方法:
container-env.json:
{
"mounts" : [
"type=bind,source=//c/Users/foo/.ssh,target=/root/.ssh,ro",
"type=bind,source=//c/Users/foo/Projects/ops-tools,target=/root/ops-tools",
"type=bind,source=//c/tmp/certs,target=/root/certs"
]
}
docker run --env-file container-env.json...
但是 docker 抱怨错误“poorly formatted environment: variable '"mounts" : [' contains whitespaces.
”,删除空格会抑制错误,但没有安装任何内容
您不能为此使用 --env-file
- 那仅适用于环境变量。
我不知道有什么方法可以在 Docker 本地执行此操作,但您可以使用 Bash 和 jq 一起破解一些东西。这是一个将 JSON 文件转换为一系列挂载选项的命令:
< container-env.json jq -r '.mounts | map("--mount \"" + . + "\"") | join("\n")'
产生这个输出:
--mount "type=bind,source=//c/Users/foo/.ssh,target=/root/.ssh,ro"
--mount "type=bind,source=//c/Users/foo/Projects/ops-tools,target=/root/ops-tools"
--mount "type=bind,source=//c/tmp/certs,target=/root/certs"
以下是您在脚本中的使用方法。
#!/usr/bin/env bash
mount_options="$(< container-env.json jq -r '.mounts | map("--mount \"" + . + "\"") | join("\n")')"
docker run $mount_options <rest of command goes here>