Развертывание контейнера докеров ThingsBoard приводит к «PSQLException`

#postgresql #docker #thingsboard

#postgresql #докер #thingsboard

Вопрос:

Я хочу развернуть ThingsBoard как контейнер Docker. Я использую этот образ и пытаюсь перезаписать некоторые переменные среды, чтобы установить соединение с внешней базой данных Postgres.

У меня просто есть Postgres, работающий localhost:5432 с (пустой) базой thingsboard данных, я создаю тома Docker mytb-data mytb-logs и запускаю:

 docker run -it -p 9090:9090 -p 1883:1883 -p 5683:5683/udp -v mytb-data:/data -v mytb-logs:/var/log/thingsboard -e SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/thingsboard -e SPRING_DATASOURCE_USERNAME=postgres -e SPRING_DATASOURCE_PASSWORD=<MY_PASSWORD_HERE> --name mytb --restart=always thingsboard/tb-postgres
  

Контейнер запускается, но журналы сообщают о следующей ошибке:

 2020-11-03 07:55:40,480 [main] ERROR o.h.e.jdbc.spi.SqlExceptionHelper - ERROR: relation "admin_settings" does not exist
  Position: 152
... [OMITTED]
Caused by: org.postgresql.util.PSQLException: ERROR: relation "admin_settings" does not exist
  Position: 152
        at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2455)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2155)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:288)
        at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:430)
        at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:356)
        at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:168)
        at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:116)
        at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52)
        at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java)
        at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57)
        ... 166 common frames omitted
pg_ctl: could not send stop signal (PID: 9): No such process
  

Есть идеи, почему это происходит?

Комментарии:

1. Похоже, что база данных не подготовлена. При ручной установке вы запустите скрипт /usr/share/thingsboard/bin/install/install.sh для этого. Я не уверен, выполняется ли это автоматически скриптами docker.

Ответ №1:

Переменные среды должны быть заключены в кавычки '[...]' в команде запуска Docker.

Это не обязательно в Docker Compose.

Для Docker запустите

 docker run -it -p 9090:9090 -p 1883:1883 -p 5683:5683/udp --name thingsboard --restart always -e SPRING_DATASOURCE_URL='<URL>' -e SPRING_DATASOURCE_USERNAME='<USERNAME>' -e SPRING_DATASOURCE_PASSWORD='<PASSWORD>' thingsboard/tb-postgres

  

Более того, я смог решить проблему, используя следующую конфигурацию (Docker Compose, аналогичную для Docker):

 thingsboard:
container_name: thingsboard
image: thingsboard/tb-postgres
restart: always
environment:
    - SPRING_DATASOURCE_URL=jdbc:postgresql://<HOSTNAME>:<PORT>/thingsboard
    - SPRING_DATASOURCE_USERNAME=<USERNAME>
    - SPRING_DATASOURCE_PASSWORD=<PASSWORD>
ports:
    - '9090:9090'
    - '1883:1883'
    - '5683:5683/udp'
  

Ответ №2:

Внутри mytb-data создается папка postgres call db, или, если у вас есть папка postgres db в другом месте, выполните следующее в этом месте. Я считаю, что у вас есть папка DB в …mytb-data / db вам нужно сделать следующее: chown -R postgres mytbpe-data / db

Поскольку папка db создается другим пользователем и является пользователем postgres, который собирается использовать эту папку, с этим, скорее всего, вы решите проблему, у меня была такая же проблема, и с этим я ее исправил.