春季启动应用程序无法链接在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.ymlapplication.yml之前被加载,并且Consul客户端必须在应用程序本身之前检查它的configuration,因此看看bootstrap.yml

工作bootstrap.yml的例子:

 spring: cloud: consul: host: consul port: 8500 discovery: prefer-ip-address: true 
  1. 运行Consul服务器,不要忘记名称选项,以配合您的configuration:

    docker run -d -p 8500:8500 --name=consul progrium/consul -server -bootstrap

  2. 领事服务器现在正在运行,运行您的应用程序图像(以前与您的工件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工很陌生, 我认为这将是一个很好的例子,但对我来说似乎并不那么容易;