2016-08-01 56 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;我認爲這將是一個很好的例子,但對我來說似乎並不那麼容易;

相關問題