无法通过docker compose

时间:2018-12-03 18:42:05

标签: docker flask docker-compose dockerfile flask-sqlalchemy

我知道这可能被标记为重复问题,但是我基本上已经尝试了互联网上的所有内容。

我用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似乎是问题所在。但我不知道如何解决。当我的应用程序启动时,数据库中必须有一个管理员用户,因此我必须使用它。

1 个答案:

答案 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

希望这会有所帮助!