我知道这可能被标记为重复问题,但是我基本上已经尝试了互联网上的所有内容。
我用mysql后端设计了一个简单的REST API。为了运行该应用程序,我试图使用docker compose来将它们都调高,但是当我调高容器时,它尝试从文件内部运行db.create_all,但是它说无法连接。以下是我的相关文件:
Dockerfile:
FROM python:latest
## make a local directory
RUN mkdir /flask_rest_service
WORKDIR /flask_rest_service
ADD . .
RUN pip install -r requirements.txt
EXPOSE 8080
CMD python code/sqlinit.py && python code/app.py
sqlinit.py:
from models.user_model import UserModel
from app import app, db
def main():
with app.app_context():
db.create_all()
admin = UserModel(username='admin', password='admin', email='subhayan.here@gmail.com')
admin.save_to_db()
if __name__ == "__main__":
main()
Docker compose.yml文件:
version: '2'
services:
web:
build: .
ports:
- "8080:8080"
container_name: web-service
depends_on:
- db
links:
- db
db:
image: mysql:latest
restart: always
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: restapi
settings.py文件:
import os
from datetime import timedelta
SECRET_KEY = os.urandom(24)
DEBUG = True
PROPAGATE_EXCEPTIONS = True
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:rootpass@db/restapi'
JWT_ACCESS_TOKEN_EXPIRES = timedelta(seconds=60)
JWT_REFRESH_TOKEN_EXPIRES = timedelta(seconds=300)
JWT_BLACKLIST_ENABLED = True
JWT_BLACKLIST_TOKEN_CHECKS = ['access', 'refresh']
从我可以看到的是sqlinit.py似乎是问题所在。但我不知道如何解决。当我的应用程序启动时,数据库中必须有一个管理员用户,因此我必须使用它。
答案 0 :(得分:0)
对于您的服务和数据库组成文件,我还将公开mysql端口,以便您的python应用程序可以使用默认的3306 TCP端口访问标准mysql容器。
因此您的compose.yml
如下所示:
version: '2'
services:
...
db:
image: mysql:latest
ports:
- "3306:3306"
restart: always
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: restapi
希望这会有所帮助!