Используйте другой порт для приложения в докере - PullRequest
0 голосов
/ 24 марта 2019

У меня есть приложение Python, которое создает контейнеры для проекта и базы данных проекта с помощью Docker.По умолчанию он использует порт 80, и если мы хотим создать несколько экземпляров приложения, я могу явно указать номер порта:

# port 80 is already used, so, try another port
$ bin/butler.py setup --port=82

Однако, также бывает, что предоставлена ​​информация о порте (используя--port) уже используется другим экземпляром того же приложения.Поэтому лучше узнать, какие порты уже используются для приложения, и не использовать ни один из них.

Как узнать, какие порты приложение использует до сих пор?Я хотел бы выполнить это внутри Python.

Ответы [ 3 ]

1 голос
/ 24 марта 2019

Вы всегда можете использовать модуль subprocess, запустить, например, ps -elf | grep bin/butler.py и проанализировать вывод с помощью регулярных выражений или простых манипуляций со строками, а затем извлечь используемые порты.

0 голосов
/ 25 марта 2019

Я пишу решение, где вы можете получить все порты, используемые докером из кода Python,

def cmd_ports_info(self, args=None):

    cmd = "docker ps --format '{{.Ports}}'"

    try:
        cp = subprocess.run(cmd,
                            shell=True,
                            check=True,
                            stdout=subprocess.PIPE)
        cp = cp.stdout.decode("utf-8").strip()

        lines = str(cp).splitlines()
        ports = []

        for line in lines:

            items = line.split(",")

            for item in items:

                port = re.findall('\d+(?!.*->)', item)
                ports.extend(port)

        # create a unique list of ports utilized
        ports = list(set(ports))
        print(colored(f"List of ports utilized till now {ports}\n" + "Please, use another port to start the project", 'green',
                      attrs=['reverse', 'blink']))

    except Exception as e:
        print(f"Docker exec failed command {e}")
        return None
0 голосов
/ 24 марта 2019

psutil может быть пакетом, который вам нужен.Вы можете использовать net_connections и захватывать порты прослушивания оттуда.

[conn.laddr.port for conn in psutil.net_connections() if conn.status=='LISTEN']
[8000,80,22,1298]
...