2016-08-01 6 views
2

私は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

領事の設定がbootstrap.ymlの代わりにapplication.ymlにあると推測できます。これは問題です。

this answerによると、bootstrap.ymlapplication.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. 作業 bootstrap.yml

  3. 現在、領事サーバーが稼働しています。 (あなたのアーティファクトと、以前に建て)Rアプリケーションイメージと領事コンテナにリンク:

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

+0

あなたはまったく正しいです。 application.ymlの名前をbootstrap.ymlに変更すると、期待どおりに動作します。どうもありがとう – user1484819

0

oblemは、depends_onはサービスの起動順序を制御するだけです。あなたは、春のアプリケーションを起動する前に、領事サーバーが起動して実行されるまで待たなければなりません。このスクリプトでこれを行うことができます。

#!/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

最初に領事を始めることを試み、完全に準備ができて準備ができてから手で加える。 – Ohmen

0

私はちょうど私はまだ解決策を持っていない最後に、それを明確にしたい、とはできませんここの状況を理解する。私はOhmenからの提案を試しました、APPコンテナで、私は領事にpingすることができます。しかし、APPはまだ領事館に接続できません。

私は、コマンドを以下により領事を起動した場合:

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

その後、私は(主な経由)で直接APPを実行することができ、そしてspring.cloud.consul.hostに接続することができます:発見。

しかし、私はドッキングウィンドウコンテナにAPPを実行しようとした場合、次のように:

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

をそれは接続を拒否して再度失敗。

私はドッカーにとって非常に新しいです&ドッカーの作成;私はそれが始めるのが良い例だと思ったが、それは容易ではないようだ。

関連する問題