From 1d5700b84221e647c168c79a1850e20ea013ae69 Mon Sep 17 00:00:00 2001 From: Konstantin Sivakov Date: Mon, 18 Feb 2019 22:51:35 +0100 Subject: [PATCH 1/2] Datastore creating at prerun with set permissions --- rootfs/setup/app/prerun.py | 55 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/rootfs/setup/app/prerun.py b/rootfs/setup/app/prerun.py index 2bd30d4..2b4eb62 100644 --- a/rootfs/setup/app/prerun.py +++ b/rootfs/setup/app/prerun.py @@ -66,12 +66,12 @@ def init_db(): print '[prerun] Start init_db...' db_command = ['paster', '--plugin=ckan', 'db', 'init', '-c', ckan_ini] - + print '[prerun] Initializing or upgrading db - start using paster db init' try: # run init scripts subprocess.check_output(db_command, stderr=subprocess.STDOUT) - + print '[prerun] Initializing or upgrading db - end' except subprocess.CalledProcessError, e: if 'OperationalError' in e.output: @@ -85,6 +85,55 @@ def init_db(): raise e print '[prerun] Initializing or upgrading db - finish' + +def init_datastore(): + + conn_str = os.environ.get('CKAN_DATASTORE_WRITE_URL') + if not conn_str: + print '[prerun] Skipping datastore initialization' + return + + datastore_perms_command = ['paster', '--plugin=ckan', 'datastore', + 'set-permissions', '-c', ckan_ini] + + connection = psycopg2.connect(conn_str) + cursor = connection.cursor() + + print '[prerun] Initializing datastore db - start' + try: + datastore_perms = subprocess.Popen( + datastore_perms_command, + stdout=subprocess.PIPE) + + perms_sql = datastore_perms.stdout.read() + # Remove internal pg command as psycopg2 does not like it + perms_sql = re.sub('\\\\connect \"(.*)\"', '', perms_sql) + cursor.execute(perms_sql) + for notice in connection.notices: + print notice + + connection.commit() + + print '[prerun] Initializing datastore db - end' + print datastore_perms.stdout.read() + except psycopg2.Error as e: + print '[prerun] Could not initialize datastore' + print str(e) + + except subprocess.CalledProcessError, e: + if 'OperationalError' in e.output: + print e.output + print '[prerun] Database not ready, waiting a bit before exit...' + time.sleep(5) + sys.exit(1) + else: + print e.output + raise e + finally: + cursor.close() + connection.close() + + def create_sysadmin(): print '[prerun] Start create_sysadmin...' @@ -131,5 +180,7 @@ if __name__ == '__main__': check_db_connection() check_solr_connection() init_db() + if os.environ.get('CKAN_DATASTORE_WRITE_URL'): + init_datastore() create_sysadmin() #time.sleep(60000) # don't end the prerun script to allow container dock and debug From 79c28db2dc608cc01fbb21c2f1349e1a719e27c6 Mon Sep 17 00:00:00 2001 From: Konstantin Sivakov Date: Tue, 19 Feb 2019 11:02:17 +0100 Subject: [PATCH 2/2] Access denied bug fix --- rootfs/Dockerfile | 2 +- rootfs/setup/app/start_ckan.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rootfs/Dockerfile b/rootfs/Dockerfile index 05fd3e6..ee341e5 100644 --- a/rootfs/Dockerfile +++ b/rootfs/Dockerfile @@ -107,7 +107,7 @@ RUN pip install -e /srv/app/src/ckan && \ RUN rm -rf /srv/app/wheels # Create entrypoint directory for children image scripts -ONBUILD RUN mkdir /docker-entrypoint.d +ONBUILD RUN mkdir docker-entrypoint.d EXPOSE 5000 diff --git a/rootfs/setup/app/start_ckan.sh b/rootfs/setup/app/start_ckan.sh index d0dc6e7..e2e69a8 100755 --- a/rootfs/setup/app/start_ckan.sh +++ b/rootfs/setup/app/start_ckan.sh @@ -3,7 +3,7 @@ python prerun.py # Run any startup scripts provided by images extending this one -if [[ -d "/docker-entrypoint.d" ]] +if [[ -d "docker-entrypoint.d" ]] then for f in /docker-entrypoint.d/*; do case "$f" in