qhwa

qhwa

Dockerize - A small hex package for creating Docker images from an Elixir project.

Hi, guys,

I’ve been playing with Elixir and Docker together for some time and today I’d like to share some of my experiences on running Elixir on Docker to the community. This includes:

  • Dockerize - the hex package that helps scaffolding
  • Two Docker base images: elixir-builder & elixir-runner, used by this package by default.

Also, I wrote a blog post on how to do it manually if you want to build your own stacks.

This is a tiny library and many others may have better solutions, but I think it will provide most of the developers a good start on deployment.

So, please check it if you’re going to de deployments, and don’t hesitate to drop any comment or advice. It will help me improving it definitely.

Thanks!

Showing Posts 1 to 10

qhwa

qhwa OP

v0.2.0 updates

  • faster building speed, normally arround 3min with fresh (depending on your project) and seconds with cache
  • smaller size of the final built image, ~30MB
  • better support for Phoenix projects. Now it automatically detect if you are in a Phoenix project.
qhwa

qhwa OP

v1.0.0 released!

  • use explicit base Docker images from scratch so developers can have full control
  • use Debian instead of Alpine as the system image by default (to trade-off for better maintainability)
  • documentation improvements

Welcome to give it a try!

dimitarvp

dimitarvp

Can you clarify on that? I am not a heavy Docker user but I do use it and so far I’ve had no problems with Alpine.

qhwa

qhwa OP

Yes! Alpine is surely amazing. I am a fan of it too but I found that I have to deal with the differences between musl and standard libc. If the library owner uses NIF and doesn’t provide prebuilt binaries, we have to compile it ourselves. Compiling on Alphine today is a bit harder than Debian because musl is not the majority. I’m sure it will get better as Alpine becomes more and more popular.

I picked Alpine because it is super small. But today thanks to Docker layer caching and cloud building, we don’t need to build locally and push to remote, sizing is not a big problem now. making the library smoother to adapt seems more important to me.

dimitarvp

dimitarvp

Yep, I’ve been bitten once by libmusl when working actively with Rust last year (by the famous slower memory allocation) but I haven’t revisited in a while and I am curious if that has been fixed.

As for NIFs and prebuilt binaries I prefer them built in the container anyway but I get what you are saying! :slight_smile:

Yep, got introduced to that several months ago and I loved it. I wonder if people are updating their Docker files en masse to make use of this fantastic feature, hmmmm.

maz

maz

Thanks for this. Any plans on doing a write-up on Rio? I like how it will fetch and maintain Let’s Encrypt certs for you.

qhwa

qhwa OP

I was shocked by how it simplified the certification flow and image building flow when I tried Rio a year ago. It’s a good direction but by that time it was unstable. I am glad to take your suggestion and give it another try!

qhwa

qhwa OP

Today I released version v1.1.0.

updates:

  • support building assets with esbuild in Phoenix 1.6
  • some improvements on the usage of ARG and ENV instructures.
maz

maz

I have a trivial hello_world phoenix 1.6 project that I’m trying to dockerize using this tool and I’m running into
#32 2.083 npm WARN npm npm does not support Node.js v10.24.0

stack after doing

mix archive.install hex dockerize
mix dockerize.init
DOCKER_BUILDKIT=1 docker build .

To try and fix this I added some lines at the beginning, but seems to not have any impact. Any ideas?

FROM hexpm/elixir:1.12.2-erlang-24.1-debian-buster-20210902 AS elixir-builder
RUN apt update && apt install -y git build-essential
+ RUN apt update
+ RUN curl -sL https://deb.nodesource.com/setup_16.x | bash -
+ RUN apt-get install -y nodejs
+ RUN apt install -y npm
 => ERROR [digest 2/2] RUN mix assets.deploy                                                                     3.3s 
------                                                                                                                
 > [digest 2/2] RUN mix assets.deploy:                                                                                
#32 2.083 npm WARN npm npm does not support Node.js v10.24.0                                                          
#32 2.086 npm WARN npm You should probably upgrade to a newer version of node as we                                   
#32 2.087 npm WARN npm can't make any promises that npm will work with this version.                                  
#32 2.088 npm WARN npm Supported releases of Node.js are the latest release of 4, 6, 7, 8, 9.                         
#32 2.088 npm WARN npm You can find the latest version at https://nodejs.org/                                         
#32 2.153                                                                                                             
#32 2.153 > @ deploy /src/assets
#32 2.153 > NODE_ENV=production tailwindcss --postcss --minify --input=css/app.css --output=../priv/static/assets/app.css
#32 2.153 
#32 3.223 /src/assets/node_modules/color/index.js:257
#32 3.223 			lum[i] = (chan <= 0.039_28) ? chan / 12.92 : ((chan + 0.055) / 1.055) ** 2.4;
#32 3.223 			                  ^^^^^
#32 3.223 
#32 3.223 SyntaxError: Invalid or unexpected token
#32 3.223     at Module._compile (internal/modules/cjs/loader.js:723:23)
#32 3.223     at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
#32 3.223     at Module.load (internal/modules/cjs/loader.js:653:32)
#32 3.223     at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
#32 3.223     at Function.Module._load (internal/modules/cjs/loader.js:585:3)
#32 3.223     at Module.require (internal/modules/cjs/loader.js:692:17)
#32 3.223     at require (internal/modules/cjs/helpers.js:25:18)
#32 3.223     at Object.<anonymous> (/src/assets/node_modules/tailwindcss/lib/util/pluginUtils.js:25:37)
#32 3.223     at Module._compile (internal/modules/cjs/loader.js:778:30)
#32 3.223     at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
#32 3.239 npm ERR! code ELIFECYCLE
#32 3.239 npm ERR! errno 1
#32 3.242 npm ERR! @ deploy: `NODE_ENV=production tailwindcss --postcss --minify --input=css/app.css --output=../priv/static/assets/app.css`
#32 3.242 npm ERR! Exit status 1
#32 3.242 npm ERR! 
#32 3.242 npm ERR! Failed at the @ deploy script.
#32 3.242 npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
#32 3.253 
#32 3.253 npm ERR! A complete log of this run can be found in:
#32 3.253 npm ERR!     /root/.npm/_logs/2021-12-14T18_53_00_631Z-debug.log
#32 3.274 ** (exit) 1
#32 3.274     (mix 1.12.2) lib/mix/tasks/cmd.ex:64: Mix.Tasks.Cmd.run/1
#32 3.274     (mix 1.12.2) lib/mix/task.ex:394: anonymous fn/3 in Mix.Task.run_task/3
#32 3.274     (mix 1.12.2) lib/mix/task.ex:452: Mix.Task.run_alias/5
#32 3.274     (mix 1.12.2) lib/mix/cli.ex:84: Mix.CLI.run_task/2
------
executor failed running [/bin/sh -c mix assets.deploy]: exit code: 1
qhwa

qhwa OP

Hi Maz, could you open an issue on Github? I just tried the latest version of Phoenix (1.6.6) and it works. According to your log, I assume this is something related to the assets compiling so if you create a repo to reproduce it, it will be perfect.

— All posts loaded —

Where Next? Top

Trending in Announcing Top

wojtekmach
Hey everyone! Req is an HTTP client for Elixir that I’ve been working on for quite some time. There is already a lot of HTTP clients out...
New
handnot2
Samly can be used to enable SAML 2.0 Single Sign On in a Plug/Phoenix application. This library uses Erlang esaml to provide plug enabl...
New
woylie
Flop is an Elixir library that applies filtering, ordering and pagination parameters to your Ecto queries. offset-based pagination with...
New
MRdotB
I needed to reuse React components from my Chrome extension in my Phoenix/LiveView backend. I noticed that for Svelte/Vue, there are live...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
fuelen
Hi all! I want to present a small library which provides a mix task for generating an Entity-Relationship Diagram for Ecto schemas. You...
New

Other Trending Topics Top

mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
mudasobwa
I am seeing a lot of aplications of Argumentum ad Vericundiam in software discussions. They do link some piece of writing and point us to...
New
AstonJ
This showed up on my feed.. anyone heard of it? Just hype? Ox Alpha is a reasoning model designed for coding, sustained ag...
New
sergio
It’s not that it’s vocabulary is too advanced. It’s something worse. I get lost trying to follow even a paragraph written by Claude. It’...
New
sorenone
Today we’re releasing Oban for Python. Not an Oban client in Python. Not a pythonx wrapper embedded in Elixir. Nope, it’s a fully operati...
New
akoutmos
@hugobarauna, Dr. Dimitrios Koutmos (my brother) and I (Alex Koutmos) have been hard at work on writing a book on how you can use Elixir ...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews