Я нахожусь внутри контейнера и хочу получить контейнер с машины/хоста Docker. Обычно я бы сделал это со своей локальной машины, но через контейнер докеров выдает ошибку:
client = docker.from_env()
client.containers.get('myPostgres')
Выплевывает:
AttributeError: 'function' object has no attribute 'get'
Привет! client.containers() возвращает следующее: "requests.exceptions.ConnectionError: ('Соединение прервано.', FileNotFoundError(2, 'Нет такого файла или каталога'))"
Пс. Да, я "pip install docker"
Открыт ли сокет докера (/var/run/docker.sock
) внутри контейнера? Какой была ваша docker run
командная строка?
Привет, нет! Это был мой запуск докера: docker run -d -i --name my_python_container python bash
Контейнер по умолчанию не будет иметь никакого доступа к хост-службе Docker (это функция безопасности: доступ к докеру является синонимом root
доступа, поэтому вы хотите предоставлять этот доступ только в определенных ситуациях).
Если вы хотите получить доступ к службе Docker вашего хоста из контейнера, вам необходимо сопоставить сокет Docker с контейнером. Как правило, это означает выполнение чего-то вроде:
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
Сравнивать:
$ docker run --rm -it docker.io/python:3.10 bash
$ pip install docker
[...]
$ python
root@2dfed359374e:/# python
Python 3.10.3 (main, Mar 18 2022, 16:01:59) [GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import docker
>>> c = docker.from_env()
Traceback (most recent call last):
[...]
FileNotFoundError: [Errno 2] No such file or directory
С этим:
$ docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock docker.io/python:3.10 bash
root@ebe430bc9463:/# pip install docker
[...]
root@ebe430bc9463:/# python
Python 3.10.3 (main, Mar 18 2022, 16:01:59) [GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import docker
>>> c = docker.from_env()
>>> c.containers.list()
[<Container: ebe430bc94>, <Container: 91f24628fd>]
Это золото. Я искал этот ответ в течение 2 часов! Спасибо большое! Сейчас это работает.
Это больше похоже на то, что вы используете более старую или другую версию модуля Python
docker
или что-то, в которомdocker.client.DockerClient.containers
является функцией, а не атрибутом. Что возвращаетclient.containers()
? Как вы установили модульdocker
?