.py
from flask import Flask
import os
app = Flask(__name__)
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY') or "a random string"
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:rootpass@database/Toons'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
from App import routes
我是我的烧瓶应用程序代码-ROUTES.PY
from flask import Flask, request, flash, url_for, redirect, render_template
from App import app
from App.DB_ORM import db, Characters#, Media
print('in routes')
@app.route('/')
@app.route('/index.html')
def index():
print('in index')
return render_template('index.html', title = 'Home')
@app.route('/about.html')
def about():
print('in about')
return render_template('about.html', title = 'About')
@app.route('/info.html', methods=['GET'])
def info():
print('in info')
recs = db.session.execute(db.select(Characters)).scalars().all()
print(recs)
return render_template('info.html', title = 'info', records = recs)
@app.route('/media.html', methods=['GET'])
def media():
print('in media')
return render_template('media.html', title = 'media')
if __name__ == '__main__':
app.run()
我是我的烧瓶应用代码-DB_ORM.PY
from flask import Flask
from App import app
from flask_sqlalchemy import SQLAlchemy
# create the database object
db = SQLAlchemy(app)
print(app.config['SQLALCHEMY_DATABASE_URI'])
#one-to-many: one set of Details has many symptoms, treatments, tests, and links
class Characters(db.Model):
__tablename__ = 'characters'
id = db.Column(db.Integer, primary_key = True)
char_name = db.Column(db.String(150))
char_role = db.Column(db.String(150))
with app.app_context():
db.create_all() #if these tables don't exist yet create them
这是我的docker文件
FROM python:3.13.1-bookworm
WORKDIR /testing_docker
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
COPY . .
#RUN apt update && apt -y install mariadb-client
CMD [ "python3", "-m" , "flask", "--app=FlaskBasic.py", "run", "--host=0.0.0.0"]
这是我的撰写文件
services:
app:
image: docker_test_app
depends_on:
db:
condition: service_healthy
restart: true
networks:
flask-net-test:
aliases:
- application
links:
- db
ports:
- "5000:5000"
db:
image: mariadb
healthcheck:
test: ["CMD", "su", "-", "mysql", "-c", "/usr/bin/mariadb-admin -h localhost -u root -prootpass ping --silent"]
retries: 5
timeout: 6s
networks:
flask-net-test:
aliases:
- database
ports:
- "3306"
environment:
MARIADB_ROOT_HOST: database
MARIADB_ROOT_PASSWORD: rootpass
MARIADB_DATABASE: Toons #This variable allows you to specify the name of a database to be created on image startup.
MARIADB_PASSWORD: rootpass
volumes:
- /opt/mariadb/backup:/var/lib/mysql
- ./db/setup.sql:/docker-entrypoint-initdb.d/setup.sql
networks:
flask-net-test:
name: flask-net-test
最后,这是我遇到的错误
Attaching to app-1, db-1
db-1 | 2025-03-03 19:55:56+00:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:11.6.2+maria~ubu2404 started.
db-1 | 2025-03-03 19:55:57+00:00 [Warn] [Entrypoint]: /sys/fs/cgroup///memory.pressure not writable, functionality unavailable to MariaDB
db-1 | 2025-03-03 19:55:57+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
db-1 | 2025-03-03 19:55:57+00:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:11.6.2+maria~ubu2404 started.
db-1 | 2025-03-03 19:55:57+00:00 [Note] [Entrypoint]: MariaDB upgrade not required
db-1 | 2025-03-03 19:55:57 0 [Note] Starting MariaDB 11.6.2-MariaDB-ubu2404 source revision d8dad8c3b54cd09fefce7bc3b9749f427eed9709 server_uid 2KQvNCDvu6PQATgLu/GVimw4hjM= as process 1
db-1 | 2025-03-03 19:55:57 0 [Note] InnoDB: Compressed tables use zlib 1.3
db-1 | 2025-03-03 19:55:57 0 [Note] InnoDB: Number of transaction pools: 1
db-1 | 2025-03-03 19:55:57 0 [Note] InnoDB: Using crc32 + pclmulqdq instructions
db-1 | 2025-03-03 19:55:57 0 [Note] mariadbd: O_TMPFILE is not supported on /tmp (disabling future attempts)
db-1 | 2025-03-03 19:55:57 0 [Warning] mariadbd: io_uring_queue_init() failed with errno 95
db-1 | 2025-03-03 19:55:57 0 [Warning] InnoDB: liburing disabled: falling back to innodb_use_native_aio=OFF
db-1 | 2025-03-03 19:55:57 0 [Note] InnoDB: Initializing buffer pool, total size = 128.000MiB, chunk size = 2.000MiB
db-1 | 2025-03-03 19:55:57 0 [Note] InnoDB: Completed initialization of buffer pool
db-1 | 2025-03-03 19:55:57 0 [Note] InnoDB: File system buffers for log disabled (block size=512 bytes)
db-1 | 2025-03-03 19:55:57 0 [Note] InnoDB: End of log at LSN=52688
db-1 | 2025-03-03 19:55:57 0 [Note] InnoDB: Opened 3 undo tablespaces
db-1 | 2025-03-03 19:55:57 0 [Note] InnoDB: 128 rollback segments in 3 undo tablespaces are active.
db-1 | 2025-03-03 19:55:57 0 [Note] InnoDB: Setting file './ibtmp1' size to 12.000MiB. Physically writing the file full; Please wait ...
db-1 | 2025-03-03 19:55:57 0 [Note] InnoDB: File './ibtmp1' size is now 12.000MiB.
db-1 | 2025-03-03 19:55:57 0 [Note] InnoDB: log sequence number 52688; transaction id 29
db-1 | 2025-03-03 19:55:57 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
db-1 | 2025-03-03 19:55:57 0 [Note] Plugin 'FEEDBACK' is disabled.
db-1 | 2025-03-03 19:55:57 0 [Note] Plugin 'wsrep-provider' is disabled.
db-1 | 2025-03-03 19:55:57 0 [Note] InnoDB: Buffer pool(s) load completed at 250303 19:55:57
db-1 | 2025-03-03 19:55:59 0 [Note] Server socket created on IP: '0.0.0.0'.
db-1 | 2025-03-03 19:55:59 0 [Note] Server socket created on IP: '::'.
db-1 | 2025-03-03 19:55:59 0 [Warning] 'user' entry 'root@database' ignored in --skip-name-resolve mode.
db-1 | 2025-03-03 19:55:59 0 [Warning] 'proxies_priv' entry '@% root@database' ignored in --skip-name-resolve mode.
db-1 | 2025-03-03 19:55:59 0 [Note] mariadbd: Event Scheduler: Loaded 0 events
db-1 | 2025-03-03 19:55:59 0 [Note] mariadbd: ready for connections.
db-1 | Version: '11.6.2-MariaDB-ubu2404' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution
db-1 | 2025-03-03 19:56:27 4 [Warning] Aborted connection 4 to db: 'unconnected' user: 'unauthenticated' host: '172.21.0.3' (This connection closed normally without authentication)
app-1 | Traceback (most recent call last):
app-1 | File "<frozen runpy>", line 198, in _run_module_as_main
app-1 | File "<frozen runpy>", line 88, in _run_code
app-1 | File "/usr/local/lib/python3.13/site-packages/flask/__main__.py", line 3, in <module>
app-1 | main()
app-1 | ~~~~^^
app-1 | File "/usr/local/lib/python3.13/site-packages/flask/cli.py", line 1129, in main
app-1 | cli.main()
app-1 | ~~~~~~~~^^
app-1 | File "/usr/local/lib/python3.13/site-packages/click/core.py", line 1082, in main
app-1 | rv = self.invoke(ctx)
app-1 | File "/usr/local/lib/python3.13/site-packages/click/core.py", line 1697, in invoke
app-1 | return _process_result(sub_ctx.command.invoke(sub_ctx))
app-1 | ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
app-1 | File "/usr/local/lib/python3.13/site-packages/click/core.py", line 1443, in invoke
app-1 | return ctx.invoke(self.callback, **ctx.params)
app-1 | ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app-1 | File "/usr/local/lib/python3.13/site-packages/click/core.py", line 788, in invoke
app-1 | return __callback(*args, **kwargs)
app-1 | File "/usr/local/lib/python3.13/site-packages/click/decorators.py", line 92, in new_func
app-1 | return ctx.invoke(f, obj, *args, **kwargs)
app-1 | ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
app-1 | File "/usr/local/lib/python3.13/site-packages/click/core.py", line 788, in invoke
app-1 | return __callback(*args, **kwargs)
app-1 | File "/usr/local/lib/python3.13/site-packages/flask/cli.py", line 977, in run_command
app-1 | raise e from None
app-1 | File "/usr/local/lib/python3.13/site-packages/flask/cli.py", line 961, in run_command
app-1 | app: WSGIApplication = info.load_app() # pyright: ignore
app-1 | ~~~~~~~~~~~~~^^
app-1 | File "/usr/local/lib/python3.13/site-packages/flask/cli.py", line 349, in load_app
app-1 | app = locate_app(import_name, name)
app-1 | File "/usr/local/lib/python3.13/site-packages/flask/cli.py", line 245, in locate_app
app-1 | __import__(module_name)
app-1 | ~~~~~~~~~~^^^^^^^^^^^^^
app-1 | File "/testing_docker/FlaskBasic.py", line 2, in <module>
app-1 | from App import app
app-1 | File "/testing_docker/App/__init__.py", line 11, in <module>
app-1 | from App import routes
app-1 | File "/testing_docker/App/routes.py", line 4, in <module>
app-1 | from App.DB_ORM import db, Characters#, Media
app-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app-1 | File "/testing_docker/App/DB_ORM.py", line 26, in <module>
app-1 | db.create_all() #if these tables don't exist yet create them
app-1 | ~~~~~~~~~~~~~^^
app-1 | File "/usr/local/lib/python3.13/site-packages/flask_sqlalchemy/extension.py", line 900, in create_all
app-1 | self._call_for_binds(bind_key, "create_all")
app-1 | ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
app-1 | File "/usr/local/lib/python3.13/site-packages/flask_sqlalchemy/extension.py", line 881, in _call_for_binds
app-1 | getattr(metadata, op_name)(bind=engine)
app-1 | ~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/sql/schema.py", line 5900, in create_all
app-1 | bind._run_ddl_visitor(
app-1 | ~~~~~~~~~~~~~~~~~~~~~^
app-1 | ddl.SchemaGenerator, self, checkfirst=checkfirst, tables=tables
app-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app-1 | )
app-1 | ^
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 3248, in _run_ddl_visitor
app-1 | with self.begin() as conn:
app-1 | ~~~~~~~~~~^^
app-1 | File "/usr/local/lib/python3.13/contextlib.py", line 141, in __enter__
app-1 | return next(self.gen)
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 3238, in begin
app-1 | with self.connect() as conn:
app-1 | ~~~~~~~~~~~~^^
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 3274, in connect
app-1 | return self._connection_cls(self)
app-1 | ~~~~~~~~~~~~~~~~~~~~^^^^^^
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 148, in __init__
app-1 | Connection._handle_dbapi_exception_noconnection(
app-1 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
app-1 | err, dialect, engine
app-1 | ^^^^^^^^^^^^^^^^^^^^
app-1 | )
app-1 | ^
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 2439, in _handle_dbapi_exception_noconnection
app-1 | raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 146, in __init__
app-1 | self._dbapi_connection = engine.raw_connection()
app-1 | ~~~~~~~~~~~~~~~~~~~~~^^
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 3298, in raw_connection
app-1 | return self.pool.connect()
app-1 | ~~~~~~~~~~~~~~~~~^^
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/pool/base.py", line 449, in connect
app-1 | return _ConnectionFairy._checkout(self)
app-1 | ~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/pool/base.py", line 1263, in _checkout
app-1 | fairy = _ConnectionRecord.checkout(pool)
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/pool/base.py", line 712, in checkout
app-1 | rec = pool._do_get()
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/pool/impl.py", line 179, in _do_get
app-1 | with util.safe_reraise():
app-1 | ~~~~~~~~~~~~~~~~~^^
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__
app-1 | raise exc_value.with_traceback(exc_tb)
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/pool/impl.py", line 177, in _do_get
app-1 | return self._create_connection()
app-1 | ~~~~~~~~~~~~~~~~~~~~~~~^^
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/pool/base.py", line 390, in _create_connection
app-1 | return _ConnectionRecord(self)
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/pool/base.py", line 674, in __init__
app-1 | self.__connect()
app-1 | ~~~~~~~~~~~~~~^^
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/pool/base.py", line 900, in __connect
app-1 | with util.safe_reraise():
app-1 | ~~~~~~~~~~~~~~~~~^^
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__
app-1 | raise exc_value.with_traceback(exc_tb)
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/pool/base.py", line 896, in __connect
app-1 | self.dbapi_connection = connection = pool._invoke_creator(self)
app-1 | ~~~~~~~~~~~~~~~~~~~~^^^^^^
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/engine/create.py", line 646, in connect
app-1 | return dialect.connect(*cargs, **cparams)
app-1 | ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
app-1 | File "/usr/local/lib/python3.13/site-packages/sqlalchemy/engine/default.py", line 622, in connect
app-1 | return self.loaded_dbapi.connect(*cargs, **cparams)
app-1 | ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
app-1 | File "/usr/local/lib/python3.13/site-packages/MySQLdb/__init__.py", line 121, in Connect
app-1 | return Connection(*args, **kwargs)
app-1 | File "/usr/local/lib/python3.13/site-packages/MySQLdb/connections.py", line 200, in __init__
app-1 | super().__init__(*args, **kwargs2)
app-1 | ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
app-1 | sqlalchemy.exc.OperationalError: (MySQLdb.OperationalError) (1130, "Host '172.21.0.3' is not allowed to connect to this MariaDB server")
app-1 | (Background on this error at: https://sqlalche.me/e/20/e3q8)
app-1 | mysql://root:rootpass@database/Toons
我认为这是本日志的重要部分
db-1 | 2025-03-03 19:56:27 4 [Warning] Aborted connection 4 to db: 'unconnected' user: 'unauthenticated' host: '172.21.0.3' (This connection closed normally without authentication)
我接下来可以尝试什么?
您试图将其连接到Mariadb作为根用户。 您还将配置中的
MARIADB_ROOT_HOST
database
的主机;也就是说,本身而不是其他容器。 最简单的修复是删除此行,删除基础数据库存储(主机系统上),以便可以再次考虑环境变量,然后重新运行您的应用程序。
正如评论员注意到的那样,您通常不想将root用户用于应用程序。 设置非根系和
sudo rm -rf /opt/mariadb/backup
可能是一个更好的做法。 您需要更改应用程序凭据以匹配。当我们更新配置时,网络设置要复杂得多,而不是必要的。 当今的Docker中,您永远不需要过时的
MARIADB_USER
选项。 撰写提供了一个名为
MARIADB_PASSWORD
的网络并将容器附加到它,这对于大多数构图规模的应用程序都很好。通常,您通常不需要手动指定的网络或复杂的选项,例如网络别名。
这将撰写的设置带入: