春季启动应用程序无法链接在docker的领事
我试图用领事作为发现服务,另外两个春季启动应用程序向领事登记; 并把它们放入docker;
以下是我的代码:应用程序:
server: port: 3333 spring: application: name: adder cloud: consul: host: consul port: 8500 discovery: preferIpAddress: true healthCheckPath: /health healthCheckInterval: 15s instanceId: ${spring.application.name}:${spring.application.instance_id:${server.port}}
2 docker-compose.yml
consul1: image: "progrium/consul:latest" container_name: "consul1" hostname: "consul1" command: "-server -bootstrap -ui-dir /ui" adder: image: wsy/adder ports: - "3333:3333" links: - consul1 environment: WAIT_FOR_HOSTS: consul1:8500
还有另一个类似的问题在Docker中不能链接Consul和Spring Boot应用程序 ; 答案build议,应用程序应该等待领事充分利用depends_on工作,我尝试了,但没有工作;
错误信息如下:
adder_1 | com.ecwid.consul.transport.TransportException: java.net.ConnectException: Connection refused adder_1 | at com.ecwid.consul.transport.AbstractHttpTransport.executeRequest(AbstractHttpTransport.java:80) ~[consul-api-1.1.8.jar!/:na] adder_1 | at com.ecwid.consul.transport.AbstractHttpTransport.makeGetRequest(AbstractHttpTransport.java:39) ~[consul-api-1.1.8.jar!/:na]
除了spring启动application.yml和docker-compose.yml,以下是App的Dockerfile
FROM java:8 VOLUME /tmp ADD adder-0.0.1-SNAPSHOT.jar app.jar RUN bash -c 'touch /app.jar' ADD start.sh start.sh RUN bash -c 'chmod +x /start.sh' EXPOSE 3333 ENTRYPOINT ["/start.sh", " java -Djava.security.egd=file:/dev/./urandom -jar /app.jar"]
和start.sh
#!/bin/bash set -e wait_single_host() { local host=$1 shift local port=$1 shift echo "waiting for TCP connection to $host:$port..." while ! nc ${host} ${port} > /dev/null 2>&1 < /dev/null do echo "TCP connection [$host] not ready, will try again..." sleep 1 done echo "TCP connection ready. Executing command [$host] now..." } wait_all_hosts() { if [ ! -z "$WAIT_FOR_HOSTS" ]; then local separator=':' for _HOST in $WAIT_FOR_HOSTS ; do IFS="${separator}" read -ra _HOST_PARTS <<< "$_HOST" wait_single_host "${_HOST_PARTS[0]}" "${_HOST_PARTS[1]}" done else echo "IMPORTANT : Waiting for nothing because no $WAIT_FOR_HOSTS env var defined !!!" fi } wait_all_hosts exec $1
我可以推断你的Consulconfiguration位于你的application.yml
而不是bootstrap.yml
,这就是问题所在。
根据这个答案 , bootstrap.yml
在application.yml
之前被加载,并且Consul客户端必须在应用程序本身之前检查它的configuration,因此看看bootstrap.yml
。
工作bootstrap.yml的例子:
spring: cloud: consul: host: consul port: 8500 discovery: prefer-ip-address: true
-
运行Consul服务器,不要忘记名称选项,以配合您的configuration:
docker run -d -p 8500:8500 --name=consul progrium/consul -server -bootstrap
-
领事服务器现在正在运行,运行您的应用程序图像(以前与您的工件build立),并将其链接到Consul容器:
docker run -d -name=my-consul-client-app --link consul:consul acme/spring-app
你的问题是, depends_on
只能控制你的服务的启动顺序。 你必须等到领事服务器启动并运行之后再启动你的spring应用程序。 你可以用这个脚本来做到这一点:
#!/bin/bash set -e default_host="database" default_port="3306" host="${2:-$default_host}" port="${3:-$default_port}" echo "waiting for TCP connection to $host:$port..." while ! (echo >/dev/tcp/$host/$port) &>/dev/null do sleep 1 done echo "TCP connection ready. Executing command [$1] now..." exec $1
在你的docker文件中的用法:
COPY wait.sh /wait.sh RUN chmod +x /wait.sh CMD ["/wait.sh", "java -jar yourApp-jar" , "consulURL" , "ConsulPort" ]
我只想澄清一下,最后我还是没有办法解决,也不了解这里的情况。 我尝试了哦,在APP容器里的build议,我可以ping consul1; 但是APP仍然没有联系领事。
如果我只通过下面的命令启动领事:
docker-compose -f docker-compose-discovery.yml up discovery
然后我可以直接运行APP(通过Main),并且可以通过spring.cloud.consul.host来连接:discovery;
但是如果我尝试在docker容器中运行APP,如下所示:
docker run --name adder --link discovery-consul:discovery wsy/adder
它再次失败,连接被拒绝;
我对docker工和docker工很陌生, 我认为这将是一个很好的例子,但对我来说似乎并不那么容易;
- 在Docker容器中运行Spring Boot应用程序,无法连接MySQL
- 两个用户在Docker中
- 在PCF中的Docker – 无法通过AMQP(spring cloud bus)连接到rabbitmq
- 连接到从docker容器到主机中打开的端口的端口
- Docker-compose从链接迁移到networkingMongoDB数据库问题
- validationdocker化的Spring Boot应用程序对docker化和链接的ActiveMQ
- 如何同步在Docker容器上运行的Java应用程序的时间?
- 如何将Spring Boot应用程序部署到Google Managed VM
- GitLab CI:我的testing作业不拾取MySQL容器