1,228 karma · joined January 10, 2011
Unless there is some magic that I'm missing, I don't think this option helps for our use case.
The difference with Debian (and other linuxes) is that the source code for the build is also provided. The upstream source might be from random place on the net, but Debian provides a source package that you can use to rebuild the binary package. Maybe the solution is for nix/nixos to provide something similar.
Unfortunately, over time I've become quite frustrated with the pull-everything from the internet model. If you are building packages from scratch each time instead of pulling down cached version using the nix command, the build breaks quite often.
Mostly it is silly stuff like the source package disappearing from the net. A particularly egregious offender is the named.root[2] file being updated, which will cause everything to fail to build until the sha is updated in the build def.
I don't know that there is a great solution for this problem. Maybe there needs to be a CI system that does from scratch build of all of the packages every day and automatically files bugs. Alternatively, a cache of sources and not just built packages could ease the pain. This issue probably affects ver few nix users, but it has demoted my love of nix down to "still likes but is somewhat annoyed by".
[1]: https://github.com/oracle/crashcart [2]: https://www.internic.net/domain/named.root
The conclusion that I have reached is that the best approach is to find a boring problem. There are so many legacy industries out there that haven't changed in decades. If you can improve one of those, you're basically printing money. This was what Uber did for Taxis. A couple of examples of startups that I've run into lately that are doing this:
ripcord.com: record storage is a multibillion dollar industry in the US alone and is largely controlled by one company that is a hundred years old and has not modernized. spruce.co: title insurance is also a huge industry that is dominated by old companies with zero technology. If you've gone through the process of buying a house you know how ridiculous the signing and title transfer is.
I think this is dramatically overstating the risks. It is possible to run containers securely, it is just much more difficult to secure containers on linux than on BSD or Solaris. It is significantly difficult to break out of a properly configured container (using user namespaces, seccomp, and selinux/apparmor), and I know of no cases where it has been done successfully.
I still separate tenants onto VMs because I don't want to be the first example of a breakout, but I don't think people who isolate with containers are crazy, just a little less risk-averse.
We also released an oci-image builder that uses a different model from docker build: https://github.com/oracle/smith
1: provide an alternative implementation of the oci-runtime so that the spec doesn't become too locked to a single implementation.
2: provide an implementation in a single language without some of the "baggage" of the existing implentations so that it is easy and fun to hack on.
3: experiment with new ideas to inform the future of the oci-runtime spec.
[1] https://hackernoon.com/the-curious-case-of-pid-namespaces-1c...
In contrast, one of the reasons I'm a big fan of go is it is extremely easy to read for almost anyone. People pick it up very quickly.
Even though I am a big fan of go, I've personally built two container runtimes in other languages do to the namespace clumsiness.
Personally, I think rust is an excellent alternative for namespace utilities.
EDIT: there is more information and links in the issue in the netns library: https://github.com/vishvananda/netns/issues/17
[1] https://www.amazon.com/Measurement-Paul-Lockhart/dp/06742843...