2016년의 훌륭한 블로그 게시물Nix를 사용하여 최소 Docker 이미지를 빌드하는 방법을 설명합니다. 다음은 해당 블로그 게시물에서 가져온 간단한 예이며 Nix 2.0을 지원하도록 수정되었습니다.
{ pkgs ? import <nixpkgs> {} }:
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
bash
x86_64-linux 빌더를 사용하려면 실행할 수 없는 실행 파일에 대한 오류로 인해 실패합니다.
$ 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 ELF 바이너리인지 확인하는 것입니다.
그런데 StackOverflow 질문에 대한 답변에서 가져온 다음 문장에서도 같은 일이 발생합니다.Nix를 사용하여 Docker 컨테이너를 구축하는 방법은 무엇입니까?, 또한 dockerTools를 사용합니다.
$ nix-build -j 1 --system x86_64-linux -E 'with import <nixpkgs> {}; pkgs.dockerTools.buildImage { name = "nix-htop"; contents = pkgs.htop; config = { Cmd = [ "/bin/htop" ]; }; }'
...역시 실패합니다:
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
여기에 공통점이 있나요?
답변1
이 답변나를 위해 작동합니다. 다음을 사용하는 대신 이와 같은 nix 표현식을 --system x86_64-linux
사용할 수 있습니다.--argstr system x86_64-linux
{ system ? "x86_64-linux", pkgs ? import <nixpkgs> { inherit system; } }:
...
예를 들어
nix-build -j 1 --argstr system x86_64-linux -E '{ system ? "x86_64-linux", pkgs ? import <nixpkgs> { inherit system; } }: pkgs.dockerTools.buildImage { name = "nix-htop"; contents = pkgs.htop; config = { Cmd = [ "/bin/htop" ]; }; }'