2017-05-02 62 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 

为寻找到它!

相关问题