mariadb Docker:如何解决链接和主机类型网络之间的冲突?

unftdfkk  于 10个月前  发布在  Docker
关注(0)|答案(1)|浏览(77)

我尝试使用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()

uurv41yg

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容器以使其正确工作。

相关问题