How to add a config file in a non-empty directory of an Openshift v3 application

9/30/2017

I deployed a PHP+postgreqsl application (TinyTiny RSS, https://github.com/dittos/ttrss-mirror) on the new Openshift v3. On initial access you create a config.php from the available template, which contains DB passwords etc. to enable tt-rss to connect to the database. Now I need to add that file to the app root directory (/opt/app-root/src/) where tt-rss expects it.

Following the apparently canonical way I created a configmap with the key config.php and the file contents as the value. However, when mounting that config file into a volume to make it available to the application, I ran into problems as it's apparently expected that the mountpoint of the volume is a non-existing directory, so when I gave a target path of /opt/app-root/src/, my application code got overwritten.

Then, I found a way to provide a single file in an already populated directory:

you need to supply the absolute path including the filename in the mountPath and the filename again in subPath. The filename (obviously) needs to match the key in your config map.

I did that, but that leads to an inaccessible (no permissions) config.php file with very strange properties, see excerpt of ls -la in the deployed pod:

drwxrwxr-x.  8 default root  4096 Sep 29 13:41 classes                                                                                                                                               
-??????????  ? ?       ?        ?            ? config.php                                                                                                                                            
-rw-rw-r--.  1 default root  8057 Sep 29 13:41 config.php-dist

config.php-dist is the template. What's up with the question marks?? Is this feature not working on Openshift?

The related YAML parts look like this:

  volumeMounts:
    - mountPath: /opt/app-root/src/config.php
      name: volume-2k03m
      subPath: config.php

and

  volumes:
    - configMap:
        defaultMode: 420
        items:
          - key: config.php
            path: config.php
        name: tt-rss-config
      name: volume-2k03m

Is there a way to fix this configuration? Is there another way to "inject" (for want of a better word) that config.php into the application?

Some people recommend symlinks, but I don't know how to programmatically create a symlink at the needed location without running into the same problems as with config.php itself.

I don't want to push it to the (public) source repo as it contains secrets and the source repo is actually an upstream repo that I would prefer not to fork and continually keep up-to-date myself.

-- Christoph
containers
kubernetes
openshift
openshift-3
php

2 Answers

9/30/2017

Not being familiar with tt-rss, the way I would do this is to pre-create the config.php file and include it in your source code. You can use environment variables in config.php for any values that would change.

And then it's not clear if you have to move the config.php file out of your repo directory or not, but anything you would need to do after a container is already running is a perfect use case for .s2i/bin scripts. Here's a sample run script, use it exactly as it is, and then just add anything else you need, like moving files, or changing permissions (note: you can't change anything that requires root permissions). Finally, any additional configuration of PHP cam be done via environment variables defined in the PHP S2I documentation.

-- Will Gordon
Source: StackOverflow

10/3/2017

Apparently, this is a current bug, see https://github.com/openshift/origin/issues/15750 and https://bugzilla.redhat.com/show_bug.cgi?id=1481617#c1.

As a workaround, specify the subPath like this: subPath: ..data/config.php, and everything starts to work as expected.

-- Christoph
Source: StackOverflow