我正在尝试使用 traefik 在 docker swarm 中安装 dspace7.6 来管理我的容器,但我的问题是,当我访问 UI 的 url 时,我看不到数据出现(社区、集合、项目)。我已将此数据直接插入到我的数据库中。
这是我的 docker compose 文件,用于启动由 traefik 管理的后端服务。它工作正常,只是我无法显示 postgresql 数据库中的数据。我怀疑用于建立连接的环境变量的 url (db__P__url:) 未正确配置。您能否告诉我如何正确配置它以访问数据。 my_db_ip_adress 是 traefik-net 网络分配给我的 dspacedb 服务的 IP 地址。 感谢您的帮助。
docker-compose-rest.yml
version: '3.9'
volumes:
assetstore:
networks:
traefik-net:
external: true
dspace:
driver: overlay
external: true
services:
# DSpace (backend) webapp container
dspace:
environment:
dspace__P__dir: /dspace
dspace__P__server__P__url: http://dspace-api.localhost/server
dspace__P__ui__P__url: http://dspace.localhost
dspace__P__name: 'DSpace Started with Docker Compose'
# db.url: Ensure we are using the 'dspacedb' image for our database
db__P__url: 'jdbc:postgresql://my_db_ip_adress:5432/dspace'
# solr.server: Ensure we are using the 'dspacesolr' image for Solr
solr__P__server: http://solr.localhost/solr
image: "${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-latest-test}"
depends_on:
- dspacedb
networks:
- traefik-net
- dspace
deploy:
labels:
- "traefik.enable=true"
- "traefik.http.routers.dspace.entrypoints=http"
- "traefik.http.routers.dspace.rule=Host(`dspace-api.localhost`)"
- "traefik.http.routers.dspace.service=dspace"
- "traefik.http.services.dspace.loadbalancer.server.port=8080"
volumes:
- assetstore:/dspace/assetstore
- solr_configs:/dspace/solr
entrypoint:
- /bin/bash
- '-c'
- |
while (!</dev/tcp/dspacedb/5432) > /dev/null 2>&1; do sleep 1; done;
/dspace/bin/dspace database migrate
catalina.sh run
dspacedb:
environment:
- PGDATA=/pgdata
- POSTGRES_PASSWORD=dspace
image: dspace/dspace-postgres-pgcrypto
networks:
- traefik-net
- dspace
deploy:
labels:
- "traefik.enable=true"
- "traefik.tcp.routers.dspacedb.entrypoints=postgres"
- "traefik.tcp.routers.dspacedb.rule=HostSNI(`*`)"
- "traefik.tcp.routers.dspacedb.tls=false"
- "traefik.tcp.routers.dspacedb.service=dspacedb"
- "traefik.tcp.services.dspacedb.loadbalancer.server.port=5432"
volumes:
- /data/services/postgres/pgdata:/pgdata
dspacesolr:
image: solr:8.11-slim
depends_on:
- dspace
networks:
- traefik-net
- dspace
deploy:
labels:
- "traefik.enable=true"
- "traefik.http.routers.dspacesolr.entrypoints=http"
- "traefik.http.routers.dspacesolr.rule=Host(`solr.localhost`)"
- "traefik.http.routers.dspacesolr.service=dspacesolr"
- "traefik.http.services.dspacesolr.loadbalancer.server.port=8983"
working_dir: /var/solr/data
volumes:
- solr_data:/var/solr/data
entrypoint:
- /bin/bash
- '-c'
- |
init-var-solr
precreate-core authority /opt/solr/server/solr/configsets/authority
cp -r /opt/solr/server/solr/configsets/authority/* authority
precreate-core oai /opt/solr/server/solr/configsets/oai
cp -r /opt/solr/server/solr/configsets/oai/* oai
precreate-core search /opt/solr/server/solr/configsets/search
cp -r /opt/solr/server/solr/configsets/search/* search
precreate-core statistics /opt/solr/server/solr/configsets/statistics
cp -r /opt/solr/server/solr/configsets/statistics/* statistics
exec solr -f
volumes:
assetstore:
pgdata:
solr_data:
solr_configs:
我不知道你是如何完成 localhost 的事情 - 也许是本地安装 dnsmasq 或 ../hosts 条目?但您也可以利用 localtest.me 或 local.gd 等服务来达到相同的结果。例如
foo.local.gd
始终解析为 127.0.0.1
Traefik 的 HostSNI 路由仅适用于 TLS 加密连接。我猜 dspacedb 上的 traefik 配置有太多噪音。
这是单节点群?我也没有看到任何以集群感知方式持久保存 dspacedb 数据的真正尝试?
问题的关键是:每次服务任务重新启动时,它都会获得新的IP。我猜你在配置中嵌入的 IP 是旧的。为什么不直接使用 docker 网状网络:Docker 将一个 dns 服务器附加到每个容器,该服务器知道它所附加的网络将按名称解析任何服务。由于您已将 dspace 和 dspacedb 连接到同一网络,因此此配置就足够了:
db__P__url: 'jdbc:postgresql://dspacedb:5432/dspace'