从python脚本容器调用ArangoDB docker容器失败

问题描述

我有一个被docker化的python脚本,在该脚本中,我调用arangoDB。我还有另一个运行arangoDB映像的容器。当我运行两个容器时,我可以在本地主机上访问arangoDB,并且如果我从其容器外部运行python脚本,则可以成功调用arangoDB。但是,当我从docker容器中运行脚本时,由于无法识别有服务器正在运行,因此无法连接到容器化的arangoDB,我得到以下错误

File "/usr/local/lib/python3.7/site-packages/arango/client.py",line 167,in db
    raise ServerConnectionError('bad connection: {}'.format(err))
arango.exceptions.ServerConnectionError: bad connection: httpconnectionPool(host='127.0.0.1',port=8529): Max retries exceeded with url: /_db/dox/_api/collection (Caused by NewConnectionError('<urllib3.connection.httpconnection object at 0x7f17a4db3450>: Failed to establish a new connection: [Errno 
111] Connection refused'))

这是我的python脚本的dockerfile

FROM python:3.7-buster

workdir /usr/src/app

copY requirements.txt ./
RUN pip install -r requirements.txt

copY . .

CMD [ "python","main.py" ]

这是我从python脚本调用arangoDB的地方:

class arangoDB():
    def __init__(self,db,username,password):
        """
        Creates an arangoDB session and connects to a specified arango database.

        Parameters
        ----------
        db : str
            arango database name
        username : str
            arango database username
        password : str
            arango database password

        Returns
        -------
        An instance of arangoDB API Wrapper
        """
        logger.info(f'User {username} Connecting to database: {db}')
        self._conn = arangoClient()
        self._db = self._conn.db(name=db,username=username,password=password,verify=True)
        logger.info(f"Successfully connected to database: {db}")
    

最后,这是我的docker-compose.yml

version: "3.8"
services: 
    arangodb:
        image: arangodb:latest
        container_name: db
        environment: 
            araNGO_ROOT_PASSWORD: route66
        ports:
            - "8529:8529"
        volumes:
            - arangodb_data:/var/lib/arangodb3
            - arangodb_apps_data:/var/lib/arangodb3-apps
    python:
        build: .
        depends_on: 
            - arangodb
        ports:
            - "5000:5000"
        container_name: myapp
networks:
    default:
        external:
            name: back

volumes:
    arangodb_data:
    arangodb_apps_data:

解决方法

我在一个容器中有apache / php,而在另一个容器中有arangodb。

我必须使用docker auto为所有正在运行的容器创建的“桥接”网络。 这些命令将向您显示所拥有的: 码头工人网络 docker网络检查网桥:

我从arangodb容器获得了IPv4Address。在我的情况下是172.17.0.2

我必须更改端点以匹配该IP地址 ArangoConnectionOptions :: OPTION_ENDPOINT =>'tcp://172.17.0.2:8529',

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...