2017-05-02 103 views
1

當前正在移動我們的應用程序開始使用泊塢窗。這是一個典型的後端和前端應用程序。前面沒有任何麻煩,但仍然無法發回。無法連接到數據庫泊塢窗

我有泊塢文件爲後端:

FROM williamyeh/java8 

RUN apt-get -y update && apt-get install -y maven 

WORKDIR /explorerbackend 

ADD settings.xml /root/.m2/settings.xml 
ADD pom.xml /explorerbackend 
ADD src /explorerbackend/src 

RUN ["mvn", "clean", "install"] 

ADD target/explorer-backend-1.0.jar /explorerbackend/app.jar 
RUN sh -c 'touch /explorerbackend/app.jar' 
ENV JAVA_OPTS="" 
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /explorerbackend/app.jar" ] 

和泊塢文件爲MySQL:

FROM mysql 
ADD createDB.sql /docker-entrypoint-initdb.d 

我使用一個單獨的文件,碼頭工人爲MySQL,而不是僅僅使用泊塢窗圖像的原因 - 必須在開始時創建2個數據庫(否​​則後端將不會啓動)

createDB.sql文件看起來像:

CREATE DATABASE IE; 
CREATE DATABASE IE_test; 

現在我有這應該開始2個容器,使後端連接到數據庫搬運工 - compose.yml文件:

version: "3.0" 

services: 
    database: 
    environment: 
     MYSQL_ROOT_PASSWORD: root 
    build: 
     context: *PATH_TO_DIR_WITH_DOCKERFILE* 
     dockerfile: Dockerfile 
    ports: 
     - 3306:3306 
    volumes: 
     - db_data:/var/lib/mysql 

    backend: 
    build: 
     context: *PATH_TO_DIR_WITH_DOCKERFILE* 
     dockerfile: Dockerfile 
    ports: 
     - 3000:3000 
    depends_on: 
     - database 

volumes: 
    db_data: 

當我運行命令泊塢窗,構成了數據庫容器啓動和運行,而後端失敗:

backend_1 | java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. 

但是我能夠登錄到數據庫容器,我也看到數據庫創建:

mysql> show databases; 
+--------------------+ 
| Database   | 
+--------------------+ 
| information_schema | 
| IE     | 
| IE_test   | 
| mysql    | 
| performance_schema | 
| sys    | 
+--------------------+ 
6 rows in set (0.00 sec) 

我看可能與陽明後端的屬性文件的唯一原因:

app: 
    data-base: 
    name: IE 
    link: database 
    port: 3306 
................. 

從前端的容器,我能ping通數據庫(但我是不允許放入屬性文件只鏈接:數據庫):

[email protected]:/frontend# ping database 
PING database (172.19.0.2): 56 data bytes 
64 bytes from 172.19.0.2: icmp_seq=0 ttl=64 time=0.086 ms 
64 bytes from 172.19.0.2: icmp_seq=1 ttl=64 time=0.088 ms 

所以,我想這是從後端容器ping的爲好,但爲什麼它無法連接到數據庫服務器?

回答

1

MySQL需要幾秒鐘才能啓動。在-爲了確認這是一個競爭條件,請嘗試以下操作:

$ docker-compose up -d database && sleep 5 && docker-compose up 

當/如果這證實了比賽條件,可以緩解與數據庫圖像上的HEALTHCHECK

參見:https://github.com/docker-library/healthcheck/tree/master/mysql

從上面的鏈接腳本:

#!/bin/bash 
set -eo pipefail 

if [ "$MYSQL_RANDOM_ROOT_PASSWORD" ] && [ -z "$MYSQL_USER" ] && [ -z "$MYSQL_PASSWORD" ]; then 
    # there's no way we can guess what the random MySQL password was 
    echo >&2 'healthcheck error: cannot determine random root password (and MYSQL_USER and MYSQL_PASSWORD were not set)' 
    exit 0 
fi 

host="$(hostname --ip-address || echo '127.0.0.1')" 
user="${MYSQL_USER:-root}" 
export MYSQL_PWD="${MYSQL_PASSWORD:-$MYSQL_ROOT_PASSWORD}" 

args=(
    # force mysql to not use the local "mysqld.sock" (test "external" connectibility) 
    -h"$host" 
    -u"$user" 
    --silent 
) 

if select="$(echo 'SELECT 1' | mysql "${args[@]}")" && [ "$select" = '1' ]; then 
    exit 0 
fi 

exit 1 
+0

我仍然遇到同樣的錯誤,即使應用5秒延遲。我仍然認爲根本原因是應用程序屬性文件,即這行:**鏈接:數據庫** – Viacheslav

+0

我不相信這是正確的,因爲我可以啓動一個MySQL容器並從同事機器連接而沒有問題 – Rawkode

0

最終,我們發現這是一種監督的問題。 的根本原因是後端dockerfile:

FROM williamyeh/java8 

RUN apt-get -y update && apt-get install -y maven 

WORKDIR /explorerbackend 

ADD settings.xml /root/.m2/settings.xml 
ADD pom.xml /explorerbackend 
ADD src /explorerbackend/src 

RUN ["mvn", "clean", "install"] 

ADD target/explorer-backend-1.0.jar /explorerbackend/app.jar 
RUN sh -c 'touch /explorerbackend/app.jar' 
ENV JAVA_OPTS="" 
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /explorerbackend/app.jar" ] 

的想法很簡單: 1.取Java圖像 2.安裝在主機 4.我的項目的Maven的 3.拷貝src文件夾中使用Maven安裝容器 5。移動jar到容器內的工作目錄 6.啓動它

但是,選項5.看起來不正確,而不是複製jar文件剛剛由容器內maven創建的內容,我是從我的主機複製它。

問題解決簡單地

RUN cp /explorerbackend/target/explorer-backend-1.0.jar /explorerbackend/app.jar 

感謝Rawcode更換

ADD target/explorer-backend-1.0.jar /explorerbackend/app.jar 

爲尋找到它!

相關問題