Как вы отправляете tcp/ip запросы из контейнера докера на хост?
Я работаю над тем, как запустить openproject с помощью Docker. Я работаю через https://www.openproject.org/docker/.
У меня работает образ докера с внешним каталогом postgres.
Сейчас я работаю над тем, как подключиться к существующему запущенному экземпляру postgresql.
Командная строка, которую я использую, выглядит нормально в соответствии с официальной документацией.
РЕДАКТИРОВАТЬ. Добавлено в отсутствующий -p.
docker run -p 8082:80 -p 5432:5432 --name openproject_dev -e SECRET_KEY_BASE=secret -e DATABASE_URL=postgresql://openproject:openproject-dev-
password@localhost:5432/openproject_dev \
-v /Users/admin/var/lib/openproject/logs:/var/log/supervisor \
-v /Users/admin/var/lib/openproject/static:/var/db/openproject openproject/community:5.0
Я опустил флаг -d [deamon], чтобы я мог видеть любые ошибки.
Когда создается докер-контейнер, я получаю
-----> You're using an external database. Not initializing a local database cluster.
/usr/src/app /usr/src/app
Starting memcached: memcached.
Что я ожидаю. Затем я получаю сообщение об ошибке подключения к серверу postgresql, чего я не ожидаю.
...
PG::ConnectionBad: could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Cannot assign requested address
Is the server running on host "localhost" (::1) and accepting
TCP/IP connections on port 5432?
/usr/local/bundle/gems/activerecord-
4.2.7.1/lib/active_record/connection_adapters/postgresql_adapter.rb:651:in `initialize'
Я предполагаю, что скрипт инициализации контейнера ожидает запуска postgres, но это не так. Как бы вы заставили порт док-контейнера перенаправлять запросы на 5432 на хост-компьютер в командной строке? ... противоположность docker, запустите -p 5432:5432 ... который выставляет 5432 из контейнера докера на хост.
2 ответа
Ваш подход в настоящее время неверен
запуск докера -p 8082:80 -p 5432:5432 - имя openproject_dev -e SECRET_KEY_BASE= секретный -e DATABASE_URL=postgresql://openproject:openproject-dev-password@localhost:5432/openproject_dev \ -v /Users/admin/var/lib/openproject/logs:/var/log/supervisor \ -v /Users/admin/var/lib/openproject/static:/var/db/openproject openproject/community:5.0
когда ты использовал -p 5432:5432
это означает, что вы ожидаете, что что-то будет работать внутри докера на этом порту, и вы хотите, чтобы ваш хост-компьютер 5432
порт для сопоставления с 5432
внутри докера.
Далее, если вы смогли выполнить эту команду, даже если внутри контейнера ничего не прослушивается, это означало бы, что порт на вашем хосте доступен. Это означает, что postgress не слушает 5432
на хосте тоже. Это может быть прослушивание на сокете. Вы должны попытаться выполнить приведенную ниже команду на хосте
psql -h 127.0.0.1
Если вы не можете подключиться к хосту, используя это, это означает, что postgres db привязан к файлу сокета, а не к IP. Теперь у вас есть несколько вариантов, которые вы можете осуществлять
Смонтировать розетку
запуск докера -p 8082:80 -p 5432:5432 - имя openproject_dev -e SECRET_KEY_BASE= секретный -e DATABASE_URL=postgresql://openproject:openproject-dev-password@localhost:5432/openproject_dev \ -v /Users/admin/var/lib/openproject/logs:/var/log/supervisor \ -v: \ -v /Users/admin/var/lib/openproject/static:/var/db/openproject openproject/community:5.0
Привязать к 0.0.0.0 на хосте
Если вы не хотите монтировать том, вам следует изменить адрес привязки psql на 0.0.0.0
а затем измените URL базы данных на -e DATABASE_URL=postgresql://openproject:openproject-dev-password@<YOURMACHINEIP>:5432/openproject_dev
Запустить в сети хоста
запуск докера --net host --name openproject_dev -e SECRET_KEY_BASE= секрет -e DATABASE_URL = postgresql: // openproject: openproject-dev-пароль @ localhost: 5432 / openproject_dev \ -v / пользователи / admin / var / lib / openproject / logs: / var / log / supervisor \ -v: \ -v / Users / admin / var / lib / openproject / static: / var / db / openproject openproject / community: 5.0
-e DATABASE_URL=postgresql://openproject:openproject-dev-
password@localhost:5432/openproject_dev
Когда вы добавляете этот URL, контейнер ожидает, что postgres будет запущен на локальном хосте, то есть сам по себе.
Если вы запускаете postgres на своем хост-компьютере, вы можете разрешить контейнеру использовать сетевой стек совместно с хостом, передав --network host
в команде запуска. В этом случае localhost будет ссылаться на хост-машину, на которой работает postgres.