docker - Nix 维持集合的原始顺序

标签 docker docker-compose nix yq

假设:
您在运行 NixOS 或某些 Linux 发行版的操作系统上安装了 yqnix

问题:
nix 可以保持集合的原始顺序吗?即,如果我创建一个sample.nix 文件:

{pkgs}:
let
dockerComposeConfig = {
    version = "1.0";
    services = {
        srv1 = { name = "srv1"; };
        srv2 = { name = "srv2"; };
    };
};
in writeTextFile {
    name = "docker-compose.json";
    text = builtins.toJSON dockerComposeConfig;

}

当我构建输出并将其转换为下面的 yaml 时,我注意到该集合已由 Nix 按字母顺序排列。是否有一种解决方法可以使我的 JSON 保持与 Docker 用户预期相同的顺序,以便 dockerComposeConfig 属性保持其创建的顺序?

# Cmd1
nix-build -E "with import <nixpkgs> {}; callPackage ./sample.nix {}"

# Cmd2
cat /nix/store/SOMEHASH-docker-compose.json | yq r - --prettyPrint

最佳答案

Nix 属性集的属性没有顺序,它们在内存中表示为排序数组。规范化值有助于提高可重复性。

如果它真的很重要,您可以编写一个函数,将键值对列表转换为 Nix 字符串形式的 JSON 对象。但这并不像 builtins.toJSON 那样易于使用。我将 JSON 视为“编译的构建输出”,并且不太担心美观。

旁注:从语义上讲,它们甚至不是按任何顺序创建的。 Nix 语言是声明性的:Nix 表达式(不包括派生)描述的是某种东西,而不是如何创建它,尽管它可以根据函数来定义。 这对于 Nix 的懒惰发挥作用是必要的。

关于docker - Nix 维持集合的原始顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60429398/

相关文章:

php - Kubernetes和PHP-FPM具有多个环境,环境变量问题

mapping - 如果容器已经创建并正在运行,如何使用docker将主机端口分配给容器端口?

docker - dockerfile 中的 CMD 与 docker-compose.yml 中的命令

docker - 如何在单个docker中为多个Web应用程序传递多个属性文件?

tomcat - Docker-compose,部署war到Tomcat,运行oracle服务

vim - 使用 Nix 中的预定义插件列表构建 vim

nix - 如何在 Nix 中组合两个列表?

Docker 在 Windows 10 代理传播到容器不起作用

ruby-on-rails - Docker无法在Rails捆绑软件上构建安装rake

haskell - Nix channel 和 GHC/Hackage 软件包版本