Hi Irina,

I think that this is an excellent idea and I totally agree with the sentiment "Availability of Qpid images will make it easier to consume/deploy Qpid components and promote Qpid visibility." I think that in 2017 it's really important for the project to be providing official maintained images as otherwise we'll continue to see a fragmented miscellany of images of unknown provenance growing up out of necessity. To be fair that seems to be a general trend on Docker Hub for many projects, but I personally tend to find it a bit frustrating and would prefer a bit more control over provenance and versioning for things used on production systems.

I'd make a few comments though.

1. It's probably better to propose this on the users list as that tends to have more traffic than the dev list. If you choose to repost on the users list feel free to include this response (if it's useful).

2. I do wonder about the comment "We can maintain docker scripts creating these images from the base OS images and using Qpid installation methods consistent with the OS distribution" and "I would look to support Fedora/CentOS latest images" and "expand OS coverage for debian/Ubuntu/etc".

I can see why this might be the /obvious/ approach, but IMHO I think that it's a somewhat poor anti-pattern for containerisation that is propagated way too often on Docker Hub and tends to result in large bloaty images with larger potential attack surfaces than necessary and in addition reinforces a model that containers are somehow "lightweight VMs" rather than containerised appliances. I very much prefer a micro-containerised approach using an approach similar to that descrived here: http://blog.oddbit.com/2015/02/05/creating-minimal-docker-images/ though acknowledging that this approach adds some complexity to the build process and requires a little care.

Ultimately reducing image size from the 400-500MB range to something like 55MB for qpidd feels like a good thing for a number of reasons, the following article contains some interesting musings on the subject https://opensolitude.com/2015/05/13/docker-images-should-be-small.html.

It's a bit more complex for Python and Java based components, but I think that basing components on lighter weight Alpine Linux based Java or Python runtimes is probably the best way to go, I note that Docker Hub is (slowly) moving towards Alpine and http://www.iron.io/ have built some uber tiny Docker images for a wide range of languages see https://github.com/iron-io/dockers and https://hub.docker.com/u/iron/

3. One question to ask is which Qpid versions would be supported by the build system. Obviously one advantage of containerisation is the ability to easily use multiple versions of an application in order to support regression testing and potentially legacy capabilities in an operational environment, but of course there is a price to be paid as older versions run into difficulties with newer compilers, boost versions etc.


I had a bit of a go at creating a build system for qpidd, my intention has been to do the same for other components, but I've been stuck for time, see https://github.com/fadams/docker-qpid though the qpid-cpp link is the only one with any useful content.

The approach that I took was to create a Dockerised build system based on Debian so that the only dependency to actually build the component is a working Docker install and an Internet connection, the build system installs the necessary dev packages then installs the requested qpid-cpp source, runs the Qpid build then it exports the relevant shared libraries etc. and dynamic linker in order that a separate Dockerfile can use these to create a small image containing only what is necessary for qpidd to execute.

I created two alternative build systems, one based on Debian wheezy the other based on jessie, the former was somewhat simpler as wheezy has somewhat older gcc and boost packages so less "wrangling" was necessary to build really old Qpid versions, with jessie I had to build gcc and boost from source. If you only intent to build recent Qpid versions much of that complexity is unnecessary as recent Qpid versions compile with recent gcc and boost versions, but I'm a little bit of a glutton for punishment and it seemed a bit more of a challenge to try and create something that could build every qpidd version from 0.5 to trunk. I suspect that the best approach might be to use jessie with the default compiler for recent Qpids and only use wheezy for older ones to provide legacy support.


I'm no bash expert so the build.sh used by the Dockerfiles is a little bit monolithic and could do with something of a refactor into functions, but hopefully what it's doing should be fairly clear.

Hope this is useful.

Best regards,

Frase


On 13/06/17 15:13, Irina Boverman wrote:
Hi everyone,

I would like to propose creating Docker images for Qpid components hosted
in Docker Hub, updated upon component release and maintained by the
project, and I would like to contribute to doing this.

Availability of Qpid images will make it easier to consume/deploy Qpid
components and promote Qpid visibility.

We can maintain docker scripts creating these images from the base OS
images and using Qpid installation methods consistent with the OS
distribution. A possible naming convention might be qpid/<component>/<OS>.
I registered the 'qpid' user on DockerHub to use if this seems reasonable.
For example, we could create qpid/dispatch/<OS> image, qpid/<broker>/<OS>
image, qpid/<client(s)>/<OS> image, etc. Initially I would look to support
Fedora/CentOS latest images and Qpid components as RPMs for them, then aim
to expand OS coverage for debian/Ubuntu/etc in the future.

The goal would be to update Qpid images within a few days upon component
release (either directly or indirectly using yum/dnf from public
repositories). We could ask the Docker team to grant Qpid "official" status
when images have been stabilized.
--
Regards, Irina.


Reply via email to