I figured this out just moments after writing to this list, actually.
libpq, the Postgresql Library used by Dovecot, will actually use the
environment variables listed below if their corresponding parameters are
not provided in the connection string:
https://www.postgresql.org/docs/8.1/libpq-envars.html
As such, these modifications will allow postgres connection using
environment variables.
dovecot.conf:
import_environment = PGUSER PGDATABASE PGPASSWORD
dovecot-sql.conf.ext:
connect = host=mail-passdb.mail.svc.cluster.local
Then, set the env variables PGUSER, PGDATABASE, PGPASSWORD in the container.
Best regards,
Eirik Rye
On 04/12/2019 13:22, Eirik Rye via dovecot wrote:
Hi,
We are trying to set up a Dovecot Docker image with dynamic database
configuration based on environment variables, however the variables do
not appear to be expanded in the "connect=" string of the SQL config.
The documentation states that environment variables, being listed under
global variables, work "everywhere":
https://doc.dovecot.org/configuration_manual/config_file/config_variables/#variables-global
However, the source code for driver-pgsql.c indicates that the connect
string is never expanded:
https://github.com/dovecot/core/blob/master/src/lib-sql/driver-pgsql.c#L297
For reference, this is my configuration. dovecot.conf:
import_environment = PASSDB_USER PASSDB_DBNAME PASSDB_PASSWORD
passdb {
override_fields = proxy=y
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
/etc/dovecot/dovecot-sql.conf.ext:
driver = pgsql
connect = host=mail-passdb dbname=%{env:PASSDB_DBNAME}
user=%{env:PASSDB_USER} password=%{env:PASSDB_PASSWORD}
Does anyone have any suggestions for how to connect to a database
without hardcoding the connection parameters in the Dovecot config,
which does not involve patching driver-pgsql.c to make the variable
expansion?
Best regards,
Eirik Rye
--
Eirik