简体   繁体   中英

Docker compose does not create users ,password and database for mysql8

My docker compose does not create mysql user,database even though i have passed them as environmental variable.here is my docker-compose.yml.

version: '3.3'
services:
web:
  image: zadiki1/posshop-webapp
  ports:
    - "3000:3000"
  depends_on:
    - db
    - phpmyadmin
  environment:
    HOST: db
    MYSQL_DATABASE: 'posshop'
    USER_NAME: 'zadik'
    PASSWORD: 'zadik'
db:
  image: mysql:8
  command: --default-authentication-plugin=mysql_native_password
  restart: always
  ports:
    - "3306:3306"
  environment:
    MYSQL_ROOT_PASSWORD: 'root'
    MYSQL_USER: 'zadik'
    MYSQL_PASSWORD: 'zadik'
    MYSQL_DATABASE: 'posshop'
    MYSQL_ROOT_HOST: '0.0.0.0'
  expose:
        - '3306'
phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin-dot
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
      PMA_HOST: db
    depends_on:
    - db
    ports:
      - 8000:80

when i go to the mysql server both the database and the user are not created I have searched online but cant find a solution

The environment variables are used to configure access to existing resources within the database. If you need to have a database posshop and a user zadik in the db ( mysql:8 ) instance, you will need to create these against the database server before you can access them, eg from web .

It is slightly inconvenient to do this with Docker Compose but, in my experience, a successful solution is to use eg a docker volume to persist the database server configuration, create the database and user while the server's configured to use this for persistence. Then, reference it subsequently in a configuration (as yours) that depends upon it.

It's possible but more challenging to have another container added to your Docker Compose that creates these assets and blocks eg web from starting until this is done.

Your docker-compose.yml file is correct (at least for the db service). It will create everything you configured - root password, user, and database.

See below:

Using the exact same yaml as you for the db service:

User-MacBook-Pro:testmysql myuser$ cat docker-compose.yml
version: '3.3'
services:
  db:
    image: mysql:8
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
      MYSQL_USER: 'zadik'
      MYSQL_PASSWORD: 'zadik'
      MYSQL_DATABASE: 'posshop'
      MYSQL_ROOT_HOST: '0.0.0.0'
    expose:
      - '3306'

Start containers:

User-MacBook-Pro:testmysql myuser$ docker-compose up -d
Creating network "testmysql_default" with the default driver
Creating testmysql_db_1 ... done

Exec into mysql container:

User-MacBook-Pro:testmysql myuser$ docker-compose exec db bash

Connect with root and list databases (which shows posshop):

root@aeba05c5cc08:/# mysql -u root -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.17 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| posshop            |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

mysql> show tables;
Empty set (0.00 sec)

mysql> exit
Bye

Connect with user (zadik/zadik):

root@aeba05c5cc08:/# mysql -u zadik -pzadik
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.17 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| posshop            |
+--------------------+
2 rows in set (0.01 sec)

mysql> use posshop;
Database changed
mysql>

Additional note: As stated in the other answer you should also create a volume to persist data (although that wasn't the question).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM