通过配置文件为以docker compose启动的mysql docker容器设置mysql根密码的正确方法是什么?

tkqqtvp1  于 2021-09-29  发布在  Java
关注(0)|答案(0)|浏览(404)

我有一个python/sqlalchemy应用程序,我想让它与mysql数据库通信,这两个数据库都在docker容器中,都是通过docker compose启动的。
我认为为mysql数据库建立凭据的正确方法是使用从配置文件中提取的环境变量。我相信这将使我能够轻松地在本地开发,然后在部署应用程序时,可以轻松地在服务器上创建一个配置文件,尽管我还不能完全确定这个过程。
现在,我的mysql数据库的密码是 root 不被接受,无论源代码是python服务器还是 docker exec -it . 也就是说,环境变量 MYSQL_ROOT_PASSWORD 在mysql容器中似乎可以正确访问。我将演示:
/docker-compose.dev.yml

  1. version: '3.8'
  2. services:
  3. api:
  4. build:
  5. context: ./backend/
  6. ports:
  7. - 5000:5000
  8. env_file:
  9. - .dev.env
  10. networks:
  11. - local-net
  12. depends_on:
  13. - mysqldb
  14. mysqldb:
  15. image: mysql
  16. # container_name: "mysqldb"
  17. ports:
  18. - 3306:3306
  19. env_file:
  20. - .dev.env
  21. volumes:
  22. - mysql:/var/lib/mysql
  23. - mysql_config:/etc/mysql
  24. networks:
  25. - local-net
  26. frontend:
  27. build:
  28. context: ./frontend/
  29. ports:
  30. - 8080:8080
  31. volumes:
  32. mysql:
  33. mysql_config:
  34. networks:
  35. local-net:
  36. driver: bridge

我相信传递env文件的正确方法是通过 env_file ,这似乎起到了作用:
/.dev.env

  1. MYSQL_ROOT_PASSWORD='password'
  2. MYSQL_USER=root
  3. MYSQL_HOST=mysqldb
  4. MYSQL_DB='remixguesser'
  5. MYSQL_PORT=3306

我相信它是有效的,因为如果我做了以下事情,它就会回来 password ```
$ docker exec -it game-remix-guesser_mysqldb_1 bash
root@206acfa56847:/# echo $MYSQL_ROOT_PASSWORD
password

  1. 但是,这不是用户的密码 `root` ```
  2. root@206acfa56847:/# mysql -u root -p
  3. Enter password:

然后输入 password 我得到:

  1. ERROR 1045 (28000): Access denied for user 'root'@'(ip)' (using password: YES)

所以 password 不是用户的密码吗 root 不管我的意图。我相信这会导致我在python中出现错误:

  1. RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods

尽管已确认我可以从环境文件访问与mysql服务器相同的环境变量:
/backend/app/database.py

  1. username = os.getenv('MYSQL_USER')
  2. password = os.getenv('MYSQL_ROOT_PASSWORD')
  3. host = os.getenv('MYSQL_HOST')
  4. port = os.getenv('MYSQL_PORT')
  5. DB_NAME = os.getenv('MYSQL_DB')
  6. print(username)
  7. print(password)
  8. print(host)
  9. print(port)
  10. SQLALCHEMY_DATABASE_URL = f"mysql+pymysql://{username}:{password}@{host}:{port}"

在获取错误之前打印:

  1. api_1 | root
  2. api_1 | password
  3. api_1 | mysqldb
  4. api_1 | 3306

如何正确地建立mysql服务器docker映像,使我能够与python服务器共享凭据并从python服务器连接到它?我相信答案是“使用 .env 因此,我的问题是,如何使用通过docker compose传入的.env配置文件为mysql docker映像正确设置用户和密码?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题