Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有自定义存储(在chroot内部)的nix在docker容器内不工作-无法解析主机:docker_Docker_Nix - Fatal编程技术网

具有自定义存储(在chroot内部)的nix在docker容器内不工作-无法解析主机:docker

具有自定义存储(在chroot内部)的nix在docker容器内不工作-无法解析主机:docker,docker,nix,Docker,Nix,引起争议 如何繁殖 在某个终端上运行这个 docker run--privileged--rm--name some docker docker docker:stable dind 保存测试文件 输出- 它不适用于--store参数 输出 如何让它工作 更新: 似乎是因为使用--store 不幸的是,nix不允许我自己创建它(touch/etc/nsswitch.confthrows权限被拒绝) 更新: 我发现我可以使用额外的沙箱路径将文件从容器装载到nix build沙箱 mounti

引起争议


如何繁殖

  • 在某个终端上运行这个
  • docker run--privileged--rm--name some docker docker docker:stable dind

  • 保存测试文件
  • 输出-

  • 它不适用于
    --store
    参数
  • 输出

    如何让它工作


    更新:

    似乎是因为使用
    --store

    不幸的是,nix不允许我自己创建它(
    touch/etc/nsswitch.conf
    throws权限被拒绝)


    更新:

    我发现我可以使用
    额外的沙箱路径
    将文件从容器装载到nix build沙箱

    mounting/etc/nsswitch.conf已解决
    curl:(6)无法解决主机:docker

    但我无法修复172.17.0.2的
    *立即连接失败:无法访问网络
    错误,我已尝试从/etc挂载所有与网络相关的文件,但它不起作用

    docker run --privileged --rm --name some-docker docker:stable-dind
    
    docker run -it --rm --link some-docker:docker --privileged -v /tmp/test.nix:/tmp/test.nix nixos/nix@sha256:85299d86263a3059cf19f419f9d286cc9f06d3c13146a8ebbb21b3437f598357 sh
    
    nix-env -i curl nettools
    
    # works
    curl -v http://172.17.0.2:2375/v1.39/version
    
    # works
    curl -v http://docker:2375/v1.39/version
    
    # lo and eth
    ifconfig -a
    
    # not empty
    netstat -rn
    
    export DOCKER_HOST=tcp://docker:2375/ && (echo "hosts: files dns" > /etc/nsswitch.conf)
    
    cat > /etc/nix/nix.conf << 'EOL'
    sandbox = false
    extra-sandbox-paths = /etc/nsswitch.conf=/etc/nsswitch.conf /etc/resolv.conf=/etc/resolv.conf /etc/hosts=/etc/hosts /etc/protocols=/etc/protocols /etc/udhcpd.conf=/etc/udhcpd.conf /etc/modules=/etc/modules
    EOL
    
    cat > /tmp/test.nix << 'EOL'
    { pkgs ? import <nixpkgs> {} }:
    with pkgs;
    stdenv.mkDerivation {
      pname = "test";
      version = "0.0.1";
      DOCKER_HOST = builtins.getEnv "DOCKER_HOST";
      buildInputs = [docker curl nettools];
      phases = "installPhase";
      installPhase = ''
        # only lo
        ifconfig -a
    
        # empty
        netstat --numeric --route
    
        # fails
        curl -v http://172.17.0.2:2375/v1.39/version
        curl -v http://docker:2375/v1.39/version
    
        docker version
        mkdir -p $out
      '';
    }
    EOL
    
    nix-build --store /tmp/store /tmp/test.nix
    
    docker run--privileged--rm--name some docker docker docker:stable dind
    docker run-it--rm--link some docker:docker--privileged-v/tmp/test.nix:/tmp/test.nix nixos/nix@sha256:85299d86263a3059cf19f419f9d286cc9f06d3c13146a8ebbb21b3437f598357 sh
    nix env-i旋涡网络工具
    #工作
    旋度-vhttp://172.17.0.2:2375/v1.39/version
    #工作
    旋度-vhttp://docker:2375/v1.39/version
    #罗和埃斯
    ifconfig-a
    #不空
    netstat-rn
    导出DOCKER\u主机=tcp://docker:2375/ &&(echo“hosts:files dns”>/etc/nsswitch.conf)
    
    cat>/etc/nix/nix.conf/tmp/test.nix如果您的
    installPhase
    运行
    curl
    ,则说明您做错了。Nix中的派生应该是纯的:它们的输出只依赖于它们声明的输入,而不依赖于其他任何东西。连接到网络的派生本质上是不纯净的:其结果将取决于调用时给定网络资源背后的内容。因此,Nix的沙箱操作(并根据其文档)故意禁止其构建者访问网络

    考虑以下情况,它仍然不纯净,但使用了
    内置。fetchurl
    ,因此不会被阻止操作:

    { pkgs ? import <nixpkgs> {} }:
    with pkgs; let
      # WARNING: This is impure; usually, downloads should include an explicit hash
      versionFile = builtins.fetchurl http://172.17.0.2:2375/v1.39/version
    in stdenv.mkDerivation {
      pname = "test";
      version = "0.0.1";
      DOCKER_HOST = builtins.getEnv "DOCKER_HOST";
      buildInputs = [docker curl nettools];
      phases = "installPhase";
      installPhase = ''
        cat ${escapeShellArg versionFile}
        docker version
        mkdir -p "$out"
      '';
    }
    
    {pkgs?导入{}}
    有pkgs;让
    #警告:这是不纯的;通常,下载应该包含一个显式散列
    versionFile=builtins.fetchurlhttp://172.17.0.2:2375/v1.39/version
    在stdenv.mk中{
    pname=“测试”;
    version=“0.0.1”;
    DOCKER\u HOST=builtins.getEnv“DOCKER\u HOST”;
    buildInputs=[docker curl nettools];
    阶段=“安装阶段”;
    安装阶段=“”
    cat${escapeShellArg versionFile}
    docker版本
    mkdir-p“$out”
    '';
    }
    

    强烈建议您使用仅使用纯Nix代码构建与Docker兼容的映像,而不要尝试在Nix派生中运行Docker。

    如果您的
    installPhase
    运行
    curl
    ,则说明您做得不对。Nix中的派生应该是纯的:它们的输出只依赖于它们声明的输入,而不依赖于其他任何东西。连接到网络的派生本质上是不纯净的:其结果将取决于调用时给定网络资源背后的内容。因此,Nix的沙箱操作(并根据其文档)故意禁止其构建者访问网络

    考虑以下情况,它仍然不纯净,但使用了
    内置。fetchurl
    ,因此不会被阻止操作:

    { pkgs ? import <nixpkgs> {} }:
    with pkgs; let
      # WARNING: This is impure; usually, downloads should include an explicit hash
      versionFile = builtins.fetchurl http://172.17.0.2:2375/v1.39/version
    in stdenv.mkDerivation {
      pname = "test";
      version = "0.0.1";
      DOCKER_HOST = builtins.getEnv "DOCKER_HOST";
      buildInputs = [docker curl nettools];
      phases = "installPhase";
      installPhase = ''
        cat ${escapeShellArg versionFile}
        docker version
        mkdir -p "$out"
      '';
    }
    
    {pkgs?导入{}}
    有pkgs;让
    #警告:这是不纯的;通常,下载应该包含一个显式散列
    versionFile=builtins.fetchurlhttp://172.17.0.2:2375/v1.39/version
    在stdenv.mk中{
    pname=“测试”;
    version=“0.0.1”;
    DOCKER\u HOST=builtins.getEnv“DOCKER\u HOST”;
    buildInputs=[docker curl nettools];
    阶段=“安装阶段”;
    安装阶段=“”
    cat${escapeShellArg versionFile}
    docker版本
    mkdir-p“$out”
    '';
    }
    

    强烈建议您使用仅使用纯Nix代码来构建与Docker兼容的映像,而不要尝试在Nix派生中运行Docker。

    (foo | | true)
    习惯用法中的子shell有什么意义,而不仅仅是
    foo | | true
    ?无论如何,Nix应该将其构建程序与网络访问隔离开来。这是一个特性,不是一个bug;它迫使你告诉nix进行带外下载,这样他们就可以将内容散列并放在存储中,或者用超时的TTL缓存。nix的
    (foo | | true)
    习惯用法中的子shell与
    foo | | true
    相比有什么意义?无论如何,nix应该将其构建者与网络访问隔离开来。这是一个特性,不是一个bug;它迫使你告诉nix进行带外下载,以便他们将内容散列并放入存储,或使用超时的TTL进行缓存。你是个天才,看起来很有前途,我将使用测试代码构建一个脚本,然后对docker:dind运行该脚本。如果您使用docker:dind来pulldocker:dind,那么您可以从Nix使用它(f/e,在指定pull图像作为其fromImage参数的情况下)--只要指定了上游图像的特定sha256,它甚至都不是不纯的。如果有人对结果感兴趣,你是个天才,看起来很有前途,我将使用测试代码构建一个脚本,然后对docker:dind运行该脚本。如果您使用docker:dind来pulldocker:dind,那么您可以从Nix使用它(f/e,在指定pull图像作为其fromImage参数的情况下)--只要指定了上游图像的特定sha256,它甚至不是不纯的。如果有人对结果感兴趣
    docker run --privileged --rm --name some-docker docker:stable-dind
    
    docker run -it --rm --link some-docker:docker --privileged -v /tmp/test.nix:/tmp/test.nix nixos/nix@sha256:85299d86263a3059cf19f419f9d286cc9f06d3c13146a8ebbb21b3437f598357 sh
    
    nix-env -i curl nettools
    
    # works
    curl -v http://172.17.0.2:2375/v1.39/version
    
    # works
    curl -v http://docker:2375/v1.39/version
    
    # lo and eth
    ifconfig -a
    
    # not empty
    netstat -rn
    
    export DOCKER_HOST=tcp://docker:2375/ && (echo "hosts: files dns" > /etc/nsswitch.conf)
    
    cat > /etc/nix/nix.conf << 'EOL'
    sandbox = false
    extra-sandbox-paths = /etc/nsswitch.conf=/etc/nsswitch.conf /etc/resolv.conf=/etc/resolv.conf /etc/hosts=/etc/hosts /etc/protocols=/etc/protocols /etc/udhcpd.conf=/etc/udhcpd.conf /etc/modules=/etc/modules
    EOL
    
    cat > /tmp/test.nix << 'EOL'
    { pkgs ? import <nixpkgs> {} }:
    with pkgs;
    stdenv.mkDerivation {
      pname = "test";
      version = "0.0.1";
      DOCKER_HOST = builtins.getEnv "DOCKER_HOST";
      buildInputs = [docker curl nettools];
      phases = "installPhase";
      installPhase = ''
        # only lo
        ifconfig -a
    
        # empty
        netstat --numeric --route
    
        # fails
        curl -v http://172.17.0.2:2375/v1.39/version
        curl -v http://docker:2375/v1.39/version
    
        docker version
        mkdir -p $out
      '';
    }
    EOL
    
    nix-build --store /tmp/store /tmp/test.nix
    
    { pkgs ? import <nixpkgs> {} }:
    with pkgs; let
      # WARNING: This is impure; usually, downloads should include an explicit hash
      versionFile = builtins.fetchurl http://172.17.0.2:2375/v1.39/version
    in stdenv.mkDerivation {
      pname = "test";
      version = "0.0.1";
      DOCKER_HOST = builtins.getEnv "DOCKER_HOST";
      buildInputs = [docker curl nettools];
      phases = "installPhase";
      installPhase = ''
        cat ${escapeShellArg versionFile}
        docker version
        mkdir -p "$out"
      '';
    }