Как заставить контейнер Docker общаться с geth.ipc на локальном хосте

from web3 import Web3

web3 = Web3(Web3.IPCProvider("/Ethereum/geth.ipc"))
print(f'IPC connected: {web3.isConnected()}')  # want to return True

У меня есть приведенный выше скрипт Dockerized, и я пытаюсь подключиться к geth.ipcлокальному хосту, и я не могу подключиться к нему.

Вот как я запускаю Docker:

docker run --mount type=bind,source=$HOME/Library/Ethereum,target=/Ethereum container1

Я проверил, что он geth.ipcсуществует в /Ethereumкаталоге, но не могу подключиться к нему. Есть ли способ сделать это?

Вопрос может быть связан с этим , и вот мой первоначальный вопрос https://stackoverflow.com/questions/52715141/how-to-make-a-docker-container-talk-to-geth-on-local-host

Если кому-то интересно, я отправил вопрос в репозиторий geth: github.com/ethereum/go-ethereum/issues/17907 .

Ответы (3)

Если вы смонтируете папку, содержащую файл IPC, а не файл напрямую, это будет работать.

Может ли разрешение вызвать проблему? Т.е. будет ли пользователь, который запускает экземпляр докера, иметь доступ к сокету, созданному пользователем на локальном хосте?
Если вы монтируете его с помощью флага -v, проблем с правами быть не должно.

Использоватьhost.docker.internal

Это работает в Docker для Mac и Docker для Windows.

Если вы работаете в Linux, все становится сложнее. Пожалуйста, взгляните на https://stackoverflow.com/questions/24319662/from-inside-of-a-docker-container-how-do-i-connect-to-the-localhost-of-the-mach .

Этот подход, кажется, не работает. Я отправлю вопрос с geth

geth.ipc представляет собой «сокет домена Unix».

В этой статье есть шаги по предоставлению отсоса сокета для контейнера докеров.

https://www.jujens.eu/posts/en/2017/Feb/15/docker-unix-socket/