6 ms·
Yeah, it feels too monolithic. Just to showcase it can run Hello World in one "docker run" command I guess? Another thing people use Docker for but shouldn't i
by snidane 8y ago
Yeah, it feels too monolithic. Just to showcase it can run Hello World in one "docker run" command I guess?
Another thing people use Docker for but shouldn't is application packaging. Using Docker you build one fossilized fat package with both all OS and app dependencies baked in. Then some day after years of using that Docker image you need to upgrade your OS version in the image but you can't replicate the app build because you didn't pin exact library versions and the global app repository's (pip, npm) later version of the package is no longer compatible with your app.
Application packaging is better to be done in proper packaging systems like rpm od deb or other proprietary ones and stored in organization's package repository. Then you can install these rpm packages in your Docker images and deploy them into cloud.
The difference in OS dependencies and app dependencies are clear when looking at contents of actual dockerfiles. OS dependencies are installed leveraging rpm or deb ecosystem. Apps are cobbled together using a bunch of bash glue and remote commands to fetch dependencies. Why not use proper packaging for both OS and apps and then just assemble the Docker image using that?
- zilian 8y agoWell mostly because some of us are just devs and we don t know about it ? How about a blog writeup, I'd read it :)
- user5994461 8y agoI don't think I ever came across a developer who made a RPM/DEB package. I'm not sure I came across a devops/sysadmin who made a RPM/DEB package in recent years. I wouldn't waste my time learning that if I were you. Software like python needs pip to build, they can't be built with the OS package manager alone.
- Spivak 8y ago> Software like python needs pip to build, they can't be built with the OS package manager alone. Well yeah, OS packaging formats are for putting together your build artifacts. You can use whatever to build the software. If you want to do it 'right' you would use pip to build packages for any missing runtime dependencies from your OS repos and the package your application. I swear it's much easier than it sounds. But nothing says you have do it like an OS maintainer though. You can also just vendor all your dependencies, slurp them all up in an RPM and install in /opt.
- fatherlinnux 8y ago+1. Back in the day, we used to mirror all of CPAN, because even as a young buck, I saw the gap in rebuilding apps without the source copied...
- snidane 8y agoWell my team does that for one. We use Python packaging ecosystem, specify Python dependencies using standard tools like setup.py, requirements.txt and pip. All Python dependencies are baked into a fat Python package using PEX format[1]. Also tried Facebook's xar format[2], without success yet. What matters is to have a statically linked dependencies packaged in one executable file. Like a Windows exe file. Then you proceed with bundling in higher level OS dependencies, because each app is not just a Python package but also a collection of shell scripts, configs, configuration of paths for caches, output directories, system variables, etc. For this we throw everything into one directory tree and run FPM [3] command on it which turns the directory tree into a RPM package. We use a fpm parameter to specify installation location of that tree to /opt or /usr elsewhere. The way to bundle it properly is to actually use two rpm packages linked together by rpm dependency. One for the app and the other for the deployment configuration. The reason is you only have one executable, but many possible versions of deploying it. Ie. depending on environment (dev, staging, prod) or you just simply want to run the same app in parallel with different configuration. eg. one rpm package for the app executable and statix files my_app_exe-2.0-1.noarch.rpm and many othe related config rpms my_app_dev-1.2-1.noarch.rpm (depends on my_app_exe > 2.0) my_app_prod-3.0-1.noarch.rpm (depends on my_app_exe == 2.0) You then install only the deployment packages and rpm system fetches the dependencies for you automatically. There are other mature places who use similar techniques for deployments, for example [4]. All of this then can be wrapped in even higher level of packaging, namely Docker. [1] https://github.com/pantsbuild/pex https://github.com/pantsbuild/pex [2] https://code.fb.com/data-infrastructure/xars-a-more-efficient-open-source-system-for-self-contained-executables/ https://code.fb.com/data-infrastructure/xars-a-more-efficien... [3] https://github.com/jordansissel/fpm https://github.com/jordansissel/fpm [4] https://hynek.me/articles/python-app-deployment-with-native-packages/ https://hynek.me/articles/python-app-deployment-with-native-...
- crehn 8y agoOur team still uses debs. In fact I made a tool to greatly simplify the process: https://github.com/hoffa/debpack https://github.com/hoffa/debpack
- ex_amazon_sde 8y agoEverything in Amazon is packaged and deployed without containers since decades. All engineers have to learn how to package their stuff.
- 1337shadow 8y agoBecause then you depend on your OS to upgrade your application dependencies.
- stingraycharles 8y agoI fail to see how RPM/Deb would be better at this (and I say this as someone who has a lot of experience in both). You will still need to pin dependencies with RPM/Deb, you still have to deal with OS release updates, and in the end it's just a matter of ensuring you frequently update and test your upstream dependencies.
- snidane 8y agoYou want to separate app and OS dependencies because in the future you could have the need to update the system which would mean rebuilding the docker package. In the future it can happen you are no longer able to reproduce your app build. But when you have the app package separate in some repository you can just create a new docker image but reuse the old app package without rebuilding it.
- gerbilly 8y ago> Using Docker you build one fossilized fat package with both all OS and app dependencies baked in. Exactly. Most uses of Docker are like a junk drawer: neat on the outside, a total mess on the inside. People stuff their python 2 app in there and forget what their dependencies are, or where they got them from. Good luck upgrading that 2-3 years from now.
- fatherlinnux 8y agoI LOVE the junk drawer analogy. I will credit you on my next blog ;-)
- cpuguy83 8y agoTo be fair, this is how people build applications. "Oh there is this library let me just pull that in"