News for hackers. Stuff that matters.
Re:Nix – Death by a Thousand Cuts by azeirah on Tuesday January 14, 2025 @03:56PM (#42703728)
The more I use nix, the more I understand it's both. Nix is genuinely so fucking great, but the ecosystem and docs and language are a mess. It needs to be cleaned up, and things _are_ getting better.

The core philosophy of Nix is so damn solid though, and that's the real innovation here. As long as its philosophy manage to stick around, then it's ok.

Re:Nix – Death by a Thousand Cuts by rob_c on Tuesday January 14, 2025 @04:07PM (#42703864)
It's basically, I refuse to learn how to containerize.

Just learn, use, promote best practices and stop forking the ecosystem _even_ further...

There, I got that off my chest.

Re:Nix – Death by a Thousand Cuts by jjmarr on Tuesday January 14, 2025 @04:20PM (#42704040)
Well, yeah.

Nix is attempting to be better than containerization.

Saying "improvements aren't necessary because we already have 'good-enough' technology" is a meaningful argument when the improvements aren't significant.

In my view, they are significant because Nix can be used to create a fully featured OS instead of just a VM.

Re:Nix – Death by a Thousand Cuts by pzmarzly on Tuesday January 14, 2025 @05:08PM (#42704599)
> they are significant because Nix can be used to create a fully featured OS instead of just a VM

Look up Bootable Containers project by RedHat [0]. Fully featured OS built from a Containerfile, bootable on bare metal.

I agree that Nix design is much better than Docker, and has a bunch of features that OCI ecosystem doesn't (e.g. remote builds[1], partial downloading of the build tree, non-linear build process[2], nix store import/export, overlays, I/O isolation, much better composability), but "creating OS instead of VM" [did you mean container?] is not one of them.

[0] https://github.com/containers/bootc

[1] You can use DOCKER_HOST, and I'm happy that this option is there, but Nix does it better.

[2] Perhaps with BuildKit it's no longer true, I haven't checked what happens if you have multi-staged build with one stage depending on multiple previous ones (which are otherwise unconnected). I think Earthly can parallelize this scenario https://earthly.dev/

Re:Nix – Death by a Thousand Cuts by cpuguy83 on Tuesday January 14, 2025 @07:03PM (#42705667)
Yes buildkit can do this. You can also use buildkit to create a bootable VM, just that nobody is doing it. You can use estargz to fetch just the pieces you need from a dependency rather than the entire depdency as well. Really all of the things you mentioned should be possible with buildkit, just that the focus of most things is Dockerfile which has much more limited functionality (though some of the things mentioned above still apply to Dockerfile).
Re:Nix – Death by a Thousand Cuts by jvandreae on Tuesday January 14, 2025 @04:17PM (#42704003)
The problem with docker is less the containerization and more the half-baked build system.
Re:Nix – Death by a Thousand Cuts by edude03 on Tuesday January 14, 2025 @04:25PM (#42704095)
As a heavy container user myself - I've been using containers since I needed to build my own 3.x kernel to test them - docker doesn't solve the reproducibility problem nix solves - IE, I can make a Dockerfile that does `RUN curl foo.com/install.sh` and who knows if that'll work ever again. Nix on the other hand doesn't allow you to do IO during builds[^0] only describe the effect of doing the IO.

[0]: Though apparently darwin (mac) doesn't support sandboxing by default, so you can bypass that but anyway

Re:Nix – Death by a Thousand Cuts by XorNot on Tuesday January 14, 2025 @06:53PM (#42705581)
You can just store the actual container though. Which will reproduce the environment exactly, it's just not a guidebook on how it was built.

The value of most reproducibility at the Dockerfile is that we're actually agnostic to getting a byte-exact reproduction: what we want is the ability to record what was important and effect upgrades.

Re:Nix – Death by a Thousand Cuts by edude03 on Tuesday January 14, 2025 @08:35PM (#42706303)
I'm not talking about a bit perfect reproduction though, just being able to understand dependencies. Take for example a simple Dockerfile like

``` FROM python:latest ADD . RUN pip install foo ```

If I run this today, and I run this a year from now, I'm going to different versions of `python` and `foo` and there is no way (with just the Dockerfile) to know which version of `foo` and `python` were intended.

Nix on the other hand, forces me to use a git sha[^0] of my dependency; there is no concept of a mutable input. So to your point it's hard to 'upgrade' from version a -> b in a controlled fashion if you don't know what `a` even was.

[0]: or the sha256 of the depedency which yes, I understand that's not easy for humans to use.

Re:Nix – Death by a Thousand Cuts by ofrzeta on Wednesday January 15, 2025 @12:52AM (#42707765)
Well, what about "FROM python:3.18" and using requirements.txt or something like that? I mean, running an arbitrary Python version will get you in trouble anyway.
Re:Nix – Death by a Thousand Cuts by neobrain on Wednesday January 15, 2025 @06:48AM (#42709866)
There's no mechanism to enforce this is done consistently. With nix, there is.

The degree to which this guarantee is useful or necessary depends on your use case.

Re:Nix – Death by a Thousand Cuts by viraptor on Wednesday January 15, 2025 @07:18AM (#42710075)
Depends on the repository used, actual version revision of Python, compiled features, the way the requirements for is written, the way the current version of pip resolves them, the base is that Python image and a lot of other things. Doing that gives you maybe 30% of the way towards something reproducible and consistent.
Re:Nix – Death by a Thousand Cuts by lmm on Tuesday January 14, 2025 @08:41PM (#42706349)
> Which will reproduce the environment exactly, it's just not a guidebook on how it was built.

By that logic every binary artifact is a "reproducible build". The point of reproducibility isn't just to be able to reproduce the exact same artifact, it's to be able to make changes that have predictable effects.

> The value of most reproducibility at the Dockerfile is that we're actually agnostic to getting a byte-exact reproduction: what we want is the ability to record what was important and effect upgrades.

More or less true. But we don't have that, because of what grandparent said; if a Dockerfile used to work and now doesn't, and there's an apt-get update in it, who knows what version it was getting back when it was working, or how to fix the problem?

Re:Nix – Death by a Thousand Cuts by photonthug on Tuesday January 14, 2025 @10:07PM (#42706881)
I do get the theoretical annoyance of how it’s technically not reproducible, but in practice most containers are pulled and not built from scratch. If you’re really concerned about that apt-get then besides a container registry you’re going to host a private package repository too, or install a versioned tarball from a public URL, but check the hash of whatever you’re downloading and put that hash in the dockerfile.

So in practice.. if the build described in the dockerfile breaks, you notice when you’re changing / extending the dockerfile.. which is the time and place where you’d expect to need to know. My guess is that most people complaining about deterministic builds for containers are not using registries for storing images, and are not deploying to platforms like k8s. If your process is, say, shipping dockerfiles to EC2 and building them in situ with “compose up” or something, then of course it won’t be very deterministic and you’re at the mercy of many more network failures, etc

Re:Nix – Death by a Thousand Cuts by XorNot on Tuesday January 14, 2025 @10:45PM (#42707081)
The issue is it's why are you trying to be reproducible. The best use case is proving authenticity: that the source code became the binary code as written, but we're so far away from that that it's not realistic.

My dream system would be CI which gives me a gigantic object graph and can sign the source code from the ground up for every single thing including the compiler, so when a change happens you can drill down to what changed, and what the diffs were.

Re:Nix – Death by a Thousand Cuts by andreasmetsala on Saturday January 18, 2025 @04:18AM (#42746984)
Re:Nix – Death by a Thousand Cuts by lmm on Wednesday January 15, 2025 @02:11AM (#42708206)
> If you’re really concerned about that apt-get then besides a container registry you’re going to host a private package repository too, or install a versioned tarball from a public URL, but check the hash of whatever you’re downloading and put that hash in the dockerfile.

Right, but if you're doing that then you probably don't need to bother with the docker part at all.

> you notice when you’re changing / extending the dockerfile.. which is the time and place where you’d expect to need to know

You notice, sure, but you can't see what it was. Like, sure, it's better than it failing when you come to deploy it, but you're still in the position of having to do software archaeology to figure out how it ever worked in the first place.

Like, for me the main use case for reproducible builds is "I need to make a small change to this component that was made by someone who left the company 3 years ago and has been quietly running since then", and you want to be able to just run the build and be confident it's going to work. You don't necessarily need to build something byte-for-byte identical to the thing that's currently running, but you do need to build something equivalent. The reproducibility isn't important per se but the declarativeness is, and with Docker you don't get that.

Re:Nix – Death by a Thousand Cuts by cpuguy83 on Wednesday January 15, 2025 @07:38AM (#42710221)
None of this has anything to do with Dockerfile but the tools used within.

Nix provides the tooling to do reproducible builds. Meanwhile docker is a wrapper around the tools you choose.

Also just to note, docker does allow you disable network access during builds. Beyond Dockerfile, which is a high level DSL, the underlying tech can do this per build step (in buildkit LLB).

Re:Nix – Death by a Thousand Cuts by cge on Wednesday January 15, 2025 @03:40PM (#42716619)
>who knows if that'll work ever again

Unless you restrict your nix files to specific channel revisions, which when I had to deal with it was poorly documented, and involved searching through specific channel commit hashes in a particularly opaque way, you also can't know that your nix derivations will ever work again.

A number of people on my field used nix as a way to make their research code repositories reproducible, and everything broke within around three years.

Re:Nix – Death by a Thousand Cuts by edude03 on Wednesday January 15, 2025 @05:29PM (#42718061)
Yeah that's a ux papercut - pre flakes nixpkgs was always the nixpkgs on your machine. There is docs but if you're not expecting that to happen you wouldn't think to look up the docs.
Re:Nix – Death by a Thousand Cuts by lreeves on Thursday January 16, 2025 @02:04PM (#42729446)
I think expecting everyone to enable a still-experimental feature is more than a papercut.
Re:Nix – Death by a Thousand Cuts by agumonkey on Tuesday January 14, 2025 @04:33PM (#42704197)
eelco thesis: 2003

lxc: 2008

docker: ~2012

Re:Nix – Death by a Thousand Cuts by mazambazz on Tuesday January 14, 2025 @05:02PM (#42704523)
Nix and containerization aren't drop-in replacements for each other.

You can use Nix to build containers. Containers on their own don't guarantee reproducibility, especially if the build process isn't static and pure ( how many times do we `sudo apt update` inside a Dockerfile )?

And not everything is going to be containerizable. That only works for most applications. What if we're trying to manage our cloud servers? That's where Nix really shines.

Do you really think that Nix developers don't know how to containerize applications? You think people are using Nix because they refuse to learn how to containerize, and therefore opt to learn a _much more_ difficult and arcane build process? The logic doesn't track there.

Re:Nix – Death by a Thousand Cuts by Cyph0n on Tuesday January 14, 2025 @06:26PM (#42705355)
Nix handles containerization better than Docker does.

Here is a flake that builds a Go app and a Docker image for it (based on headless Chrome): https://github.com/aksiksi/ncdmv/blob/aa108a1c1e2c14a13dfbc0...

And here is how the image is built in CI: https://github.com/aksiksi/ncdmv/blob/aa108a1c1e2c14a13dfbc0...

Re:Nix – Death by a Thousand Cuts by lolinder on Tuesday January 14, 2025 @07:37PM (#42705938)
You're going to need to do more than just link to the flake if you want to show why that's better than the Dockerfile equivalent, because the code itself isn't selling it.
Re:Nix – Death by a Thousand Cuts by Cyph0n on Tuesday January 14, 2025 @07:47PM (#42706008)
1. Unbelievable layer reuse out of the box. Each Nix build output is placed in its own layer, including your binary (up to a max of 120 or so layers). Rebuilding the image will only result in the final layer changing, which minimizes work on image push.

2. Everything is pinned to nixpkgs, including dependencies. Anyone who builds this image will get the exact same versions (vs. apt-get update in a Dockerfile pulling a more recent version). It’s just sqlite in this case, but you can imagine how it would work with more dependencies.

3. It is trivial to build a “FROM scratch” image - in fact, that’s the default behavior in Nix, because Nix implicitly includes all runtime dependencies alongside your binary. This is less of a challenge with Go, but YMMV with other languages.

4. You can define your entrypoint script - or any other one-off script - in-line. Not a huge advantage, but still quite useful.

There is even an alternative pattern that allows you to reap these same benefits directly in your Dockerfile:

https://mitchellh.com/writing/nix-with-dockerfiles

Hope that helps.

Re:Nix – Death by a Thousand Cuts by knoopx on Wednesday January 15, 2025 @06:00AM (#42709579)
here is a derivation that fetches https://www.usememos.com/ from source, changes the color palette, builds a docker image out of it and spins up a container that traefik exposes automatically: https://gist.github.com/knoopx/afde5e01389e3b8446f469c056e59...
Re:Nix – Death by a Thousand Cuts by Cyph0n on Wednesday January 15, 2025 @05:06PM (#42717788)
Very cool! I actually considered implementing the Compose Build spec this way for compose2nix, but instead opted to just use Docker/Podman directly.
Re:Nix – Death by a Thousand Cuts by azeirah on Tuesday January 14, 2025 @07:15PM (#42705771)
Huh? I use Nix to create containers. Nix is a programming language, a build tool, a package manager and an entire ecosystem of extremely powerful tools.

The entire reason why I use Nix in the first place is because it allows me to containerize with _better_ reproducibility than docker itself.

I do get where you're coming from though. It's not immediately clear that Nix can do all this stuff. Nix is a lot more than just "glorified weird package manager".

At its core, Nix is a way to specify dependencies in a mathematically sound manner. Once you have that pure dependency graph managed with Nix, you can start doing the _real_ fun stuff.

Like, you can containerize it. Or you can create a VM from it, or an ISO, or a NixOS distribution with _only_ that package installed.

Nix actually makes containerization _easier_, not harder. But yes, I empathize. Nix is a mess and it is difficult to understand, it will take a few more years before it is fully settled.

In the meantime? I'm going all-in on Nix (the philosophy, not necessarily any particular variant) because I really strongly believe this is the way forward.

Re:Nix – Death by a Thousand Cuts by ofrzeta on Wednesday January 15, 2025 @12:53AM (#42707772)
> Nix is a programming language, a build tool, a package manager and an entire ecosystem of extremely powerful tools

You have identified part of the problem.

Re:Nix – Death by a Thousand Cuts by azeirah on Wednesday January 15, 2025 @02:36AM (#42708352)
I agree. This _is_ a huge problem.
Re:Nix – Death by a Thousand Cuts by turboponyy on Wednesday January 15, 2025 @02:29AM (#42708314)
Containerizing an application is far easier than packaging an application for Nix - I think most avid Nix users would agree with that.

The reason why Nix users "refuse" to containerize is that Nix packages and their associated ecosystem come with a host of benefits that their containerized counterparts do not.

Re:Nix – Death by a Thousand Cuts by rcxdude on Wednesday January 15, 2025 @06:00AM (#42709583)
containers with build scripts are a bandaid over broken systems, it's better practice then having zero executable documentation on how to stand up a system, but it's also far from the best that could exist.
Re:Nix – Death by a Thousand Cuts by exe34 on Wednesday January 15, 2025 @07:51AM (#42710304)
no thank you.
Re:Nix – Death by a Thousand Cuts by vendiddy on Wednesday January 15, 2025 @05:58PM (#42718378)
This is how I feel about Nix.

I've given it a try and it's quite incredible how easy certain things are.

The problem is the Nix language and the developer experience are really rough.

There's a chance that Nix could figure this out or a competitor with Nix-like ideas could become mainstream. That's my hope anyway.

It would be a shame if the ideas behind Nix got dismissed because of the current issues with Nix.