我有一个python/sqlalchemy应用程序,我想让它与mysql数据库通信,这两个数据库都在docker容器中,都是通过docker compose启动的。
我认为为mysql数据库建立凭据的正确方法是使用从配置文件中提取的环境变量。我相信这将使我能够轻松地在本地开发,然后在部署应用程序时,可以轻松地在服务器上创建一个配置文件,尽管我还不能完全确定这个过程。
现在,我的mysql数据库的密码是 root
不被接受,无论源代码是python服务器还是 docker exec -it
. 也就是说,环境变量 MYSQL_ROOT_PASSWORD
在mysql容器中似乎可以正确访问。我将演示:
/docker-compose.dev.yml
version: '3.8'
services:
api:
build:
context: ./backend/
ports:
- 5000:5000
env_file:
- .dev.env
networks:
- local-net
depends_on:
- mysqldb
mysqldb:
image: mysql
# container_name: "mysqldb"
ports:
- 3306:3306
env_file:
- .dev.env
volumes:
- mysql:/var/lib/mysql
- mysql_config:/etc/mysql
networks:
- local-net
frontend:
build:
context: ./frontend/
ports:
- 8080:8080
volumes:
mysql:
mysql_config:
networks:
local-net:
driver: bridge
我相信传递env文件的正确方法是通过 env_file
,这似乎起到了作用:
/.dev.env
MYSQL_ROOT_PASSWORD='password'
MYSQL_USER=root
MYSQL_HOST=mysqldb
MYSQL_DB='remixguesser'
MYSQL_PORT=3306
我相信它是有效的,因为如果我做了以下事情,它就会回来 password
```
$ docker exec -it game-remix-guesser_mysqldb_1 bash
root@206acfa56847:/# echo $MYSQL_ROOT_PASSWORD
password
但是,这不是用户的密码 `root` ```
root@206acfa56847:/# mysql -u root -p
Enter password:
然后输入 password
我得到:
ERROR 1045 (28000): Access denied for user 'root'@'(ip)' (using password: YES)
所以 password
不是用户的密码吗 root
不管我的意图。我相信这会导致我在python中出现错误:
RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
尽管已确认我可以从环境文件访问与mysql服务器相同的环境变量:
/backend/app/database.py
username = os.getenv('MYSQL_USER')
password = os.getenv('MYSQL_ROOT_PASSWORD')
host = os.getenv('MYSQL_HOST')
port = os.getenv('MYSQL_PORT')
DB_NAME = os.getenv('MYSQL_DB')
print(username)
print(password)
print(host)
print(port)
SQLALCHEMY_DATABASE_URL = f"mysql+pymysql://{username}:{password}@{host}:{port}"
在获取错误之前打印:
api_1 | root
api_1 | password
api_1 | mysqldb
api_1 | 3306
如何正确地建立mysql服务器docker映像,使我能够与python服务器共享凭据并从python服务器连接到它?我相信答案是“使用 .env
因此,我的问题是,如何使用通过docker compose传入的.env配置文件为mysql docker映像正确设置用户和密码?
暂无答案!
目前还没有任何答案,快来回答吧!