我尝试使用mysqlalchemy将PyQt应用程序连接到容器化的MariaDB服务器。我对Docker完全陌生。在Qt论坛的帮助下,我似乎可以设法使我的应用程序容器与MariaDB容器通信。我的剩余问题是如何连接到X11服务器?我在this question on stackoverflow中发现了一些提示,但当我使用此解决方案时,我得到以下消息
sudo docker-compose run app [sudo]当前位置:使用默认驱动程序创建网络“project_default”正在创建mydb 2.正在创建project_app_run...误差,误差
错误:for project_app_run无法为服务应用程序创建容器:相互冲突的选项:主机类型网络不能与链接一起使用。这将导致未定义的行为
错误:对于应用程序无法为服务应用程序创建容器:相互冲突的选项:主机类型网络不能与链接一起使用。这将导致未定义的行为错误:启动项目时遇到错误。
我必须补充一点,我的系统是Fedora 38,使用的是X11,而不是wayland。
如何解决此冲突,因为我必须同时连接到MariaDB和X11服务器?
以下是相关档案
码头撰写.yml
version: "3"
volumes:
data:
services:
db:
container_name: mydb2
image: mariadb:latest
ports:
- "32001:3306"
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: root
volumes:
- data:/var/lib/mysql
app:
container_name: biere
links:
- "db"
build: ./
environment:
- DISPLAY=$DISPLAY
- QT_DEBUG_PLUGINS=1
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix
- ~/.Xauthority:/root/.Xauthority
ports:
- "5001:5000"
network_mode: "host"
字符串
插接文件
FROM fedora:38
ENV DISPLAY=:0
COPY . .
RUN dnf -y upgrade
RUN dnf -y install python3 python3-pip
RUN python3 -m pip install -r dependencies.txt
RUN dnf install -y mesa-libGLU libxkbcommon libxkbcommon-x11 mesa-libEGL fontconfig dbus-libs xcb-util-cursor xcb-util-wm xcb-util-keysyms xauth
CMD [ "python3", "main.py" ]
型
db_connection.py
from sqlalchemy import create_engine
from sqlalchemy_utils import create_database, database_exists
from sqlalchemy.orm import sessionmaker, scoped_session
from database.orm_base import Base
db_url="mysql+pymysql://root:root@mydb2:3306/a_db"
if not database_exists(db_url):
create_database(db_url)
engine = create_engine(db_url,pool_size=5,pool_recycle=3600)
Session =sessionmaker(bind=engine,expire_on_commit=False)
session =Session()
型
1条答案
按热度按时间uurv41yg1#
您应该删除
links:
和network_mode: host
选项。链接是第一代Docker网络的产物。Docker网络不是Docker最初版本的一部分,但它们在这一点上非常广泛和成熟。新的基于Docker插件的Compose版本根本不支持在没有Docker网络的情况下运行容器。链接有一些网络不提供的小功能,但你几乎不需要它们。如果你有
links: [simple_name]
,你可以删除这个块,而不改变其他任何东西。主机网络完全禁用Docker的网络层。对于某些管理类型的工具,有时候需要这样做;我经常看到建议将
localhost
作为主机系统。使用此选项将禁用容器之间通过主机名的连接,它不会为您提供隐藏或重新Map容器的侦听端口的选项,并且当您使用Docker Desktop时(特别是在非Linux主机上),它实际上不起作用。您为
app
容器显示的volumes:
可能足以访问X Window系统。您可能需要显式地设置一个环境变量DISPLAY=:0.0
(/tmp/.X11-sock
套接字文件对应于这个确切的显示地址)。这根本不使用TCP网络,因此您不需要为此更改Docker网络选项。您确实需要确保通过Compose服务名
db
访问数据库;你可能需要设置一个额外的环境变量MYSQL_HOST=db
或者配置app
容器以使其正确工作。