Docker image does not follow changes to `MYSQL_HOST` variable
Nobody has claimed this yet.
- Dominant language
- Shell
- Stars
- 7.4k
- Forks
- 1.9k
- PR merge metrics
- No merged PRs in 30d
Description
Initially opened nextcloud/server/issues/40904, was told it's a docker issue, so here I copy over the relevant sections.
Bug description
In the "Auto configuration via environment variables" section of the Docker Readme, one can use MYSQL_HOST to set the database connection info, and NEXTCLUOD_UPDATE=1 to automate installation.
The problem is when we want to change that MySQL_HOST into something else. We change the environment variable, restart the container, and we get this error: SQLSTATE[HY000] [2006] MySQL server has gone away.
We investigate and find that, while the autoconfig.php reads environment variables, the config.php is hard-coded at installation time with the actual IP/PORTS:
<?php
$CONFIG = array (
...
'dbhost' => '10.66.60.1:9971',
...
OK, let's try to use the CLI command to edit that hard-coded file, like this:
php occ config:system:set dbhost --value 1.2.3.4
We then get this error again: SQLSTATE[HY000] [2006] MySQL server has gone away
So the config:system:set can't fix the dbhost variable without trying to connect to the old, faulty dbhost!
That means the only option is either to manually edit the config file, to overwrite it with sed, or to overwrite it entirely (which sounds complex because it has to keep all the generated secrets already present in it).
The same issue happens with all other environment variables: db pass, user, database name, https override settings, etc.
Steps to reproduce
Trivial Docker-compose example that renames "db" into "db2": https://gist.github.com/gabriel-v/c6e5a1e18686f39649546c1161fadd64
- Install docker container using auto-configuration environment variable for MYSQL
- Change the IP/PORT of the MYSQL server
- Update the environment variables for auto-configuration and restart the Nextcloud server
Expected behavior
Nextcloud starts successfully with the new DB connection info
Installation method
Community Docker image
Nextcloud Server version
confirmed on 26, 27, latest docker images
Work-Around
https://github.com/nextcloud/helm/tree/main/charts/nextcloud#multiple-configphp-file
Create file config/dbhostoverride.config.php with content:
<?php
$CONFIG = array (
'dbhost' => getenv('MYSQL_HOST'),
);
And add keys to this file for each value expected to change (dbport, passwords, etc.)
This solution is the cleanest, but still requires injecting templates into the image for environment variables that we already set.
Suggestions
This causes a great deal of confusion: one expects the environment variable to be the source of truth for configuring the image. Inspecting the autoconfig.php file also does not help, because it's not obvious the $AUTOCONFIG var is used only at install time, while the $CONFIG var is used at run time.
- readme edit suggestion: https://github.com/nextcloud/docker/pull/2085
- maybe the docker image could add a default
docker-environment.config.phpfile with all the envs overridden, like:
$CONFIG = array (
'dbhost' => getenv('MYSQL_HOST') || getenv('POSTGRES_HOST') || ...,
... => ...
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reading the Docker README's environment-variable configuration section, autoconfig.php, and the generated config.php, then reproduce the db-to-db2 change using the linked Docker Compose example. Compare installation-time values with runtime configuration and review the proposed config/dbhostoverride.config.php approach and pull request 2085. Done means changing the documented environment variables lets the container start with the new database settings without manual config-file edits.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- docker, php, shell
- Domain
- devops, infrastructure
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100