From 804947f0399b2dfb632595b299cc01ec8e09e993 Mon Sep 17 00:00:00 2001 From: Girish Ramakrishnan Date: Tue, 17 Jan 2017 23:49:22 -0800 Subject: [PATCH] use dir mount instead of file mount file mounting is fraught with problems wrt change notifications. first, we must be carefule that the inode does not change. second, changes outside container do not result in fs events inside the container. haraka cache settings files and relies on fs events. So, even though the file gets updated inside the container, haraka doesn't see it. https://github.com/docker/docker/issues/15793 --- setup/start.sh | 4 ++-- src/infra_version.js | 2 +- src/platform.js | 12 ++++-------- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/setup/start.sh b/setup/start.sh index e8fd2d4fb..8b16548e3 100755 --- a/setup/start.sh +++ b/setup/start.sh @@ -126,9 +126,9 @@ mkdir -p "${DATA_DIR}/mysql" mkdir -p "${DATA_DIR}/postgresql" mkdir -p "${DATA_DIR}/mongodb" mkdir -p "${DATA_DIR}/snapshots" -mkdir -p "${DATA_DIR}/addons" +mkdir -p "${DATA_DIR}/addons/mail" mkdir -p "${DATA_DIR}/collectd/collectd.conf.d" -mkdir -p "${DATA_DIR}/acme" # acme challenges +mkdir -p "${DATA_DIR}/acme" echo "==> Configuring journald" sed -e "s/^#SystemMaxUse=.*$/SystemMaxUse=100M/" \ diff --git a/src/infra_version.js b/src/infra_version.js index e9665942e..6a83222e7 100644 --- a/src/infra_version.js +++ b/src/infra_version.js @@ -17,7 +17,7 @@ exports = module.exports = { 'postgresql': { repo: 'cloudron/postgresql', tag: 'cloudron/postgresql:0.15.0' }, 'mongodb': { repo: 'cloudron/mongodb', tag: 'cloudron/mongodb:0.11.0' }, 'redis': { repo: 'cloudron/redis', tag: 'cloudron/redis:0.10.0' }, - 'mail': { repo: 'cloudron/mail', tag: 'cloudron/mail:0.26.0' }, + 'mail': { repo: 'cloudron/mail', tag: 'cloudron/mail:0.27.0' }, 'graphite': { repo: 'cloudron/graphite', tag: 'cloudron/graphite:0.10.0' } } }; diff --git a/src/platform.js b/src/platform.js index 09d1358aa..60f22aa2b 100644 --- a/src/platform.js +++ b/src/platform.js @@ -227,9 +227,7 @@ function createMailConfig(callback) { user.getOwner(function (error, owner) { var alertsTo = [ 'webmaster@cloudron.io' ].concat(error ? [] : owner.email).join(','); - // be careful of how this file is created because mail_vars is a file mount - // and an inode change won't reflect in the container (https://github.com/docker/docker/issues/15793) - if (!safe.fs.writeFileSync(paths.DATA_DIR + '/addons/mail_vars.ini', + if (!safe.fs.writeFileSync(paths.DATA_DIR + '/addons/mail/mail_vars.ini', `mail_domain=${fqdn}\nmail_server_name=${mailFqdn}\nalerts_from=${alertsFrom}\nalerts_to=${alertsTo}`, 'utf8')) { return callback(new Error('Could not create mail var file:' + safe.error.message)); } @@ -252,8 +250,8 @@ function startMail(callback) { certificates.getAdminCertificate(function (error, cert, key) { if (error) return callback(error); - if (!safe.fs.writeFileSync(paths.DATA_DIR + '/addons/tls_cert.pem', cert)) return callback(new Error('Could not create cert file:' + safe.error.message)); - if (!safe.fs.writeFileSync(paths.DATA_DIR + '/addons/tls_key.pem', key)) return callback(new Error('Could not create key file:' + safe.error.message)); + if (!safe.fs.writeFileSync(paths.DATA_DIR + '/addons/mail/tls_cert.pem', cert)) return callback(new Error('Could not create cert file:' + safe.error.message)); + if (!safe.fs.writeFileSync(paths.DATA_DIR + '/addons/mail/tls_key.pem', key)) return callback(new Error('Could not create key file:' + safe.error.message)); settings.getMailConfig(function (error, mailConfig) { if (error) return callback(error); @@ -272,9 +270,7 @@ function startMail(callback) { --memory-swap ${memoryLimit * 2}m \ -v "${dataDir}/box/mail:/app/data" \ -v "${dataDir}/mail:/run" \ - -v "${dataDir}/addons/tls_cert.pem:/etc/tls_cert.pem:ro" \ - -v "${dataDir}/addons/tls_key.pem:/etc/tls_key.pem:ro" \ - -v "${dataDir}/addons/mail_vars.ini:/etc/mail.ini:ro" \ + -v "${dataDir}/addons/mail:/etc/mail" \ ${ports} \ --read-only -v /tmp ${tag}`;