Hi,

So far, the approach for writing Dockerfiles for WSO2 products has been to
write a generic Dockerfile that can be manipulated to build different
images with different approaches. For example, to generalize the way in
which the product is configured inside the image during build time, a
concept called "Provisioning methods" was introduced. This would allow
different configuration methods ("default" which is copying a plain old
pack into the image, and "puppet" which runs Puppet scripts during the
image build) to configure the image.

However, the cost of such a generalized approach is the increased
complexity of the script layer around the Dockerfile and the necessity of
the bootstrap tasks done by the scripts. Because of this,

1. New users have found it hard to quickly start using the Dockerfiles to
build the images
2. Users with prior Docker knowledge have struggled to understand the
reasoning behind such a thick layer of bootstrapping
3. Customization to existing scripts require a steep learning curve
4. Product teams have found it difficult to commit resources to maintain
the scripts+Dockerfiles
5. Dockerfiles cannot be used in pure Docker commands without the complex
bootstrapping involved

One of the main reasons for following such a complex layer of script based
bootstrapping and a somewhat convoluted Dockerfile was to reduce the
resulting Docker image size. At the time, Docker's Copy-On-Write strategy
was not kind on a number of changes we would be doing for a WSO2 Server.
This required "clever" hacks to be performed so that there would be minimal
inter-layer changes. One of these hacks was to copy and modify the WSO2
server packs and the JDK in the same layer. We were able to reduce the
Docker image sizes for a standard ESB image from somewhere around 2GB to
800MB through this approach.

However, Docker has now started to address the image size concerns raised
by the community. One of the solutions Docker has started to put forward is
the --squash flag [1]. This is still an experimental feature but is
available with the recent Docker CE releases. With --squash flag, there is
no need for Dockerfile instruction manipulation to get a smaller Docker
image. It's reasonable to assume that Docker would keep improving this
functionality in the future.

With this in mind, evolving the current set of Dockerfiles into a simpler
set and reducing the bash script based bootstrapping layer to a minimum is
IMO the best approach to resolve the above-mentioned issues. In such a
simple approach, a Dockerfile would only need the WSO2 Server pack and the
JDK distribution, for it to be built. Pure `docker build` command can be
used to build the image and would be the expected way to do so.  A sample
Dockerfile for WSO2 EI/Integrator 6.1.1 can be found at [2].

There would be different Dockerfiles for different runtimes of a product,
different versions, and if we plan to use any config automation for image
configuration during the image build, there would be different images for
each approach as well. Yes, this would duplicate a lot of stuff, but it
would reduce the complexity by a few times for the end-user, who would
always be a devops or a developer (wso2 or non-wso2).

The advantages of such an approach would be

1. Easier learning curve required for both types of users who are familiar
with Docker and those who are not.
2. Increased adaptation and maintenance by the product teams resulting from
the easier learning curve
3. Can be incorporated into client's existing pipelines easily because of
the lack of bootstrapping needed and the ability to use pure `docker build`
commands
4. Possibility of adding WSO2 Dockerfiles to DockerHub's official
repositories (Popular Dockerfiles such as Ubuntu [3] and MySQL [4] have
almost zero build time ARGs, and follow a similar approach to what I've
suggested above)
5. Requires a less complex code structuring (there is no need for a base
image definition)

Appreciate any input on this.


[1] -
https://medium.com/@chamilad/docker-image-size-concerns-out-of-the-window-squash-with-confidence-796f7c48f5c6
[2] -
https://github.com/chamilad/wso2-dockerfiles-new/blob/master/wso2ei/6.1.1/Dockerfile
[3] -
https://github.com/docker-library/mysql/tree/86431f073b3d2f963d21e33cb8943f0bdcdf143d
[4] -
https://github.com/tianon/docker-brew-ubuntu-core/tree/5fce3945d95630c2fc03c21ef8665d92bd824642

Regards,
Chamila de Alwis
Committer and PMC Member - Apache Stratos
Senior Software Engineer | WSO2
+94 77 220 7163 <+94%2077%20220%207163>
Blog: https://medium.com/@chamilad
_______________________________________________
Architecture mailing list
Architecture@wso2.org
https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture

Reply via email to