2016-08-01 122 views
2

我想使用Consul作为发现服务,另外两个春季启动应用程序向Consul注册;并把它们放入码头;春季启动应用程序无法链接在码头的领事

下面是我的代码: 应用程式:

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搬运工-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 

还有另外一个类似的问题Cannot link Consul and Spring Boot app in Docker; 答案建议,应用程序应该等待领事完全工作,通过使用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] 

除了春季启动application.yml和泊坞窗,compose.yml,以下是应用程序的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 

回答

0

我可以推断您的Consul配置位于您的application.yml而不是bootstrap.yml,这就是问题所在。

this answerbootstrap.ymlapplication.yml之前加载和领事客户端应用程序本身之前检查它的结构,所以看bootstrap.yml。工作bootstrap.yml

例子:

spring: 
    cloud: 
    consul: 
     host: consul 
     port: 8500 
     discovery: 
     prefer-ip-address: true 
  1. 运行领事服务器,不要忘了选项,以配合您的配置:

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

  2. 领事服务器现在正在运行,运行你读应用程序图像(与你的神器以前建造),并将其链接到领事容器:

    docker run -d -name=my-consul-client-app --link consul:consul acme/spring-app

+0

你是完全正确的。在将application.yml重命名为bootstrap.yml后,它只是按预期工作;非常感谢 – user1484819

0

您的评价问题是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 

使用方法:你可以这样做与此脚本

COPY wait.sh /wait.sh 
RUN chmod +x /wait.sh 
CMD ["/wait.sh", "java -jar yourApp-jar" , "consulURL" , "ConsulPort" ] 
+0

我用了你的脚本,但仍然没有工作。我只是打印出“TCP连接准备好...”,然后通过,并给予相同的连接拒绝失败。 – user1484819

+0

我用nc $ {host} $ {port}>/dev/null 2>&1/dev/tcp/$ host/$ port)&>/dev/null,等待和等待。 – user1484819

+0

尝试首先启动领事,等待他们完全启动并准备好,然后启动加法器manualy。 – Ohmen

0

我只是想澄清的是,我终于还是没有解决,而不能了解这里的情况;我尝试了来自Ohmen的建议,在APP容器中,我可以ping consul1;但APP仍然没有联系领事;

如果我只启动通过以下命令领事:

docker-compose -f docker-compose-discovery.yml up discovery 

然后,我可以(通过主)直接运行该应用程序,它是能够与连接spring.cloud.consul.host:发现;

但是,如果我尝试在泊坞窗容器中运行的应用程序,像下面:

docker run --name adder --link discovery-consul:discovery wsy/adder 

它与连接失败再次拒绝;

我很新来的码头& docker-compose;我认为这将是一个很好的例子,但对我来说似乎并不那么容易;

相关问题