Dockerfiles in Fedora should not contain net new code. The meaning of this is that software should be packaged properly as RPMs and placed in the Fedora repositories, Dockerfiles are simply a deliver mechanism for pre-defined "ready to run" configurations. Any content that is to accompany the Dockerfile must either be configuration files or startup/orchestration scripts. The goal of this is such that we follow the key points of the Fedora Release Engineering Philosophy.
There are no limits to the developer in deciding where to put the files that are required for starting the container. Those files might be either starting script, configuration files, template files that are evaluated once the container is started or anything else. General rule is that if the file can be provided by RPM, it should be provided by RPM. That is also reason why the files that are not provided by RPM should be put into the same location as if they would come from RPM, because they might eventually end in the RPM.
Whatever the location will be, it is good idea to use similar location to similar container images, for example when a PostgreSQL container image uses some schema, MariaDB should use a similar schema, because that is what users will expect.
The recommended location and naming scheme is the following (MySQL taken as an example):
Main executables that users usually use; one of them is usually set as default CMD
Script that is run during container build to prepare container content; with this command we can run only one command instead of having a complicated scripts directly in the Dockerfile
Main config file for the daemon, the location of the config file should be the same as in RPM, because it is what users expect
Template for another config file, its content may be evaluated using
Path to the data, that is often a docker VOLUME; the
In order to have the Dockerfile clean, it is good practice to put all the files into one directory and use their final location under that directory. In case of the MySQL example above, it might look like this:
Adding all the files in the Dockerfile can be then as simple as this:
COPY root /
The source files may be stored on FTP or some other medium that does not keep UNIX file attributes,
so the Dockerfile or
container-setup script should make sure the files will have proper attributes set,
like that files in
/usr/bin/* are executable, etc.
Each container image should provide only one "service" and multi-container services should be handled by an external orchestration tool at the users discretion such as [https://www.openshift.org/ OpenShift Origin], [http://kubernetes.io/ kubernetes], [http://deis.io/ deis], [https://docs.docker.com/swarm/ Docker Swarm], [https://docs.docker.com/compose/ Docker Compose], [https://dcos.io/ DC/OS], [https://www.cloudfoundry.org/ Cloud Foundry], [https://mesos.apache.org/ Apache Mesos], etc.
Want to help? Learn how to contribute to Fedora Docs ›