NixOS Linux

2021-01-11 11:38:19

$#嗨! $#想知道如何开始使用Nix? $#以下是一些示例:$ node -e" console.log(1 + 1)" node:找不到命令$#有趣的是,这台机器上没有节点$#Nix没问题! $ nix-shell -p nodejs(nix-shell)$节点-e" console.log(1 + 1)" 2(nix-shell)$#现在我们的环境有了节点。 (nix-shell)$#不会使用户环境混乱! :) $#输入" nix-shell -p ..."每次都可能很乏味。我们可以做得更好。 $#我们可以将所有内容记入shell.nix $ cat -n shell.nix 1 {pkgs?导入< nixpkgs> {}#这里我们导入了nixpkgs软件包集2}:3 pkgs.mkShell {#mkShell是一个辅助函数4 name =" dev-environment&#34 ;; #需要名称5 buildInputs = [#和软件包列表6 pkgs.nodejs 7]; 8 shellHook ='' #输入外壳程序9时要运行的bash echo"开始开发..." 10'&#39 ;; 11} $#暂停视频以了解shell.nix $#只需运行以下命令即可进入dev-environment:$ nix-shell开始开发...(nix-shell)$ node -e" console.log(1 +1)" 2(nix-shell)$#现在继续将shell.nix提交到您的存储库(nix-shell)$#并与您的同事共享您的开发环境$#对于最后一个示例,让我们使用Nix构建一个最小的docker映像$ cat -n docker-redis.nix 1 {pkgs吗?导入< nixpkgs> {system =" x86_64-linux&#34 ;;} 2}:#nixpkgs软件包设置了3个pkgs.dockerTools.buildLayeredImage {#帮助构建docker映像4的助手=" nix-redis&#34 ;; #为Docker映像命名5个标签=" latest&#34 ;; #提供标签6个内容= [pkgs.redis]; #docker镜像中的软件包7} $#暂停视频,花点时间了解docker-redis.nix文件$#现在让我们构建docker镜像并将其加载到docker $ nix-build docker-redis.nix -o ./result ...跳过输出... /nix/store/1crapx24sjgqm2j1wmq17k6f6a9wy66d-docker-image-nix-redis.tar.gz $ docker load -i ./result加载的图像:nix-redis:latest $ docker images | grep redis debian-redis最新的8366943c77e8 3天前13​​6MB alpine-redis最新的aae644cd3417 3天前6.99MB nix-redis最新30486183a209 50年前45.4MB $#我们的docker映像的大小介于Debian和$之间#高山映像##nixpkgs中打包的redis尚未针对小尺寸进行优化$#让我们修复此问题! $ cat -n redis-minimal.nix 1 {pkgs?导入< nixpkgs> {} 2}:3 pkgs.redis.overrideAttrs(旧:{4#在我们的docker映像中不需要系统支持5 makeFlags = old.makeFlags ++ [" USE_SYSTEMD = no"]; 6#构建带有musl 7 preBuild的静态二进制='' 8 makeFlagsArray =(PREFIX =" $ out" 9 CC =" $ {pkgs.musl.dev} / bin / musl- gcc -static" 10 CFLAGS =" -I $ {pkgs.musl.dev} / include" 11 LDFLAGS =" -L $ {pkgs.musl.dev} / lib" )12'' 13#让我们删除一些不需要的二进制文件14 postInstall =" rm -f $ out / bin / redis- {benchmark,check -*,cli}&#34 ;; 15})$#在redis-minimal.nix中,我们通过以下三个更改覆盖了默认的redis构建:$#1.)删除redis systemd支持$#2。)构建静态链接使用musl $#二进制文件。3.)除去redis-server $#之外的所有二进制文件现在,让我们使用我们新创建的最小redis $ cat -n docker-redis-minimal.nix 1 {pkgs吗?导入< nixpkgs> {system =" x86_64-linux&#34 ;;} 2}:#nixpkgs软件包设置3令4 redisMinimal = import ./redis-minimal.nix {继承pkgs; }; 6之5中的pkgs.dockerTools.buildLayeredImage {#构建Docker映像的助手7名称=" nix-redis-minimal&#34 ;; #为docker image命名为8 tag =" latest&#34 ;; #提供标签9的内容= [redisMinimal]; #使用redisMinimal软件包10} $#现在构建新的docker镜像$ nix-build docker-redis-minimal.nix -o ./result ...跳过输出... / nix / store / 83zcgs5xvzrgx09iv8s82wkabl8xkr03- $ docker load -i ./result加载的图像:nix-redis-minimal:latest $ docker images | | docker-image-nix-redis-minimal.tar.gz $ grep redis debian-redis最新消息3366943c77e8 3天前13​​6MB alpine-redis最新消息aae644cd3417 3天前6.99MB nix-redis最新消息50年前45.4MB nix-redis-minimal最新消息a21238890680 50年前2.02MB $#我们只是产生了码头工人的图像比高山的_小?有趣! $#去告诉你的朋友:) $#这是Nix可以做的快速尝试。 $#我希望我们让您渴望自己尝试一下。 $#快乐的幸福!