首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >"bash:无法执行二进制文件“在nix dockerTools交叉构建期间从MacOS主机生成。

"bash:无法执行二进制文件“在nix dockerTools交叉构建期间从MacOS主机生成。
EN

Unix & Linux用户
提问于 2018-09-20 23:51:33
回答 1查看 1K关注 0票数 3

2016年年的一篇博文描述了用Nix构建最小的Docker映像。下面是该博客文章中的一个简单示例,经过修改以支持Nix2.0:

代码语言:javascript
运行
复制
{ pkgs ? import  {} }:

with pkgs;
dockerTools.buildImage {
  name = "redis";
  runAsRoot = ''
    #!${stdenv.shell}
    ${dockerTools.shadowSetup}
    groupadd -r redis
    useradd -r -g redis -d /data -M redis
    mkdir /data
    chown redis:redis /data
  '';

  config = {
    Cmd = [ "${gosu.bin}/bin/gosu" "redis" "${redis}/bin/redis-server" ];
    ExposedPorts = {
      "6379/tcp" = {};
    };
    WorkingDir = "/data";
    Volumes = {
      "/data" = {};
    };
  };
}

使用nix-linuxkit具有x86_64-linux构建器,这会导致bash可执行文件出现错误,无法运行:

代码语言:javascript
运行
复制
$ nix-build -j 1 --system x86_64-linux redis-small.nix
these derivations will be built:
  /nix/store/iixmgfhsczc71484vcwqwz2nzlg0rcv1-extra-commands.sh.drv
  /nix/store/jsydsrzs7h9pfnh8m6cxaysa9bafmp2z-redis-config.json.drv
  /nix/store/csfmyw6va3b8dabshliqjkrrdr6n090w-vm-run-stage2.drv
  /nix/store/l0p201r6zjfzsznfb6ykca1l8n09lyb9-vm-run.drv
  /nix/store/s64kqfyggqm60l5j9wy6s1nz39iwkxiw-run-as-root.sh.drv
  /nix/store/zidg0xphc7yjc4n0w3k7wnifz6rlqgzh-docker-layer-redis.drv
  /nix/store/12ahsincv8igv492gzjjvw9s8aaff65i-runtime-deps.drv
  /nix/store/pyx4q2wln2shlnjdp5ng43aqd6iba80d-docker-image-redis.tar.gz.drv
building '/nix/store/jsydsrzs7h9pfnh8m6cxaysa9bafmp2z-redis-config.json.drv'...
/nix/store/6v88ick1cxnn5g91m8qrrqww0lrlr27x-bash-4.4-p23/bin/bash: /nix/store/6v88ick1cxnn5g91m8qrrqww0lrlr27x-bash-4.4-p23/bin/bash: cannot execute binary file
builder for '/nix/store/jsydsrzs7h9pfnh8m6cxaysa9bafmp2z-redis-config.json.drv' failed with exit code 126
cannot build derivation '/nix/store/pyx4q2wln2shlnjdp5ng43aqd6iba80d-docker-image-redis.tar.gz.drv': 1 dependencies couldn't be built
error: build of '/nix/store/pyx4q2wln2shlnjdp5ng43aqd6iba80d-docker-image-redis.tar.gz.drv' failed

这里的关键线是/nix/store/6v88ick1cxnn5g91m8qrrqww0lrlr27x-bash-4.4-p23/bin/bash: cannot execute binary file。使用file来检查它,它确实是一个Linux二进制文件。

顺便说一句,同样的情况也发生在以下一行中,它是从StackOverflow happens 如何用Nix构建码头集装箱?的回答中摘取的,也使用了dockerTools:

代码语言:javascript
运行
复制
$ nix-build -j 1 --system x86_64-linux -E 'with import  {}; pkgs.dockerTools.buildImage { name = "nix-htop"; contents = pkgs.htop; config = { Cmd = [ "/bin/htop" ]; }; }'

...fails类似地:

代码语言:javascript
运行
复制
building path(s) ‘/nix/store/gz4lrsjcmxbcmdfpmazwz0wqnb5pbw8k-nix-htop-config.json’
/nix/store/nkq0n2m4shlbdvdq0qijib5zyzgmn0vq-bash-4.4-p12/bin/bash: /nix/store/nkq0n2m4shlbdvdq0qijib5zyzgmn0vq-bash-4.4-p12/bin/bash: cannot execute binary file
builder for ‘/nix/store/487mmw8kql56q7h6iq4c7hfzh4k0gv50-nix-htop-config.json.drv’ failed with exit code 126

dockerTools是这里的公共线程吗?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2021-06-02 02:27:14

这个答案为我工作。不需要使用--system x86_64-linux,您可以使用--argstr system x86_64-linux和像下面这样的nix表达式

代码语言:javascript
运行
复制
{ system ? "x86_64-linux", pkgs ? import  { inherit system; } }:
...

例如

代码语言:javascript
运行
复制
nix-build -j 1 --argstr system x86_64-linux -E '{ system ? "x86_64-linux", pkgs ? import  { inherit system; } }: pkgs.dockerTools.buildImage { name = "nix-htop"; contents = pkgs.htop; config = { Cmd = [ "/bin/htop" ]; }; }'
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/470420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档