This is what I see when I am in the container created by docker-compose:
mysql> SELECT user FROM mysql.user;
+------+
| user |
+------+
| root |
+------+
1 row in set (0.00 sec)
root@541e4d686184:/# echo $MYSQL_USER
dbuser
So dbuser
is not present in the users table even though the $MYSQL_USER
is set properly .
In docker-compose.yml
I have this:
version: '2'
services:
db:
image: mysql:latest
environment:
MYSQL_DATABASE: mydb
MYSQL_USER: dbuser
MYSQL_PASSWORD: userpass
MYSQL_ROOT_PASSWORD: password
ports:
- "3306"
volumes:
- ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
- my-datavolume:/var/lib/mysql
volumes:
my-datavolume:
I expected dbuser
to be created automatically, but that didn't happen.
I also have a sql
file to create my database and tables if they don't already exist, but right now tomcat can't connect to my database.
Same symptoms as this question, but I am already using a dictionary for my usernames/passwords.
UPDATE:
I am getting close. When inside container I manually did:
/docker-entrypoint-initdb.d/create_users.sh
Then the user was created inside MySQL
table and I was able to deploy my application to my tomcat
server and I didn't get an error about dbuser
being denied access.
So, why did I have to run this command myself, it should be run by docker-compose, according to the mysql docker docs under Initializing a fresh instance.
The Problem: Docker writes files as root This can cause us pain, because those files will be owned by the root user.
Running a MySQL Docker image would look like this: Install Docker engine on the physical host. Download a MySQL image from public (Docker Hub) or private repository, or build your own MySQL image. Run the MySQL container based on the image, which is similar to starting the MySQL service.
How about:
docker-compose down -v
From the documentation:
-v
- Remove volumes declared in the volumes section of the Compose file.
Your database has been already created inside a volume, so any changes of initial settings in docker-compose.yml
won't be reflected.
In case you want to remove just a single volume, you may use docker volume ls
to list all existing volumes and then docker volume rm <VOLUME NAME>
to remove it.
Note: Bind mounts are not removed with the -v
flag, so in case you are using them instead of volumes, you'll have to manually delete folders containing MySQL
data. In docker-compose
bind mounts are created whenever you provide a source path in your volumes
section (eg. /my-path:/var/lib/mysql
).
Worked for me : stop docker and remove manually all the folder containing MySQL data from previous builds.
Also : don't forget to add a MYSQL_DATABASE
environment var or it won't create the user you specified.
Github issue
Important to note that the image entrypoint script will never make changes to an existing database. If you mount an existing data directory into var/lib/mysql, options like MYSQL_ROOT_PASSWORD will have no effect
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With