Docker应用程序无法与数据库容器通信

时间:2018-01-11 20:06:35

标签: docker docker-compose dockerfile

我在一个容器中运行mysql DB,并在另一个容器中运行web应用程序。我的用例是一旦数据库容器启动并运行应用程序容器必须使用Liquibase将一些初始数据插入到数据库并启动应用程序。我的docker yml如下所示。

db:
    build: kdb
    user: "1000:50"
    volumes:
      - /data/mysql:/var/lib/mysql
    container_name: kdb
    environment:  
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
    image:  kdb
    ports:
      - "3307:3306"



k-api:
    container_name: k_api
    hostname: k-api
    domainname: i.com
    image:  k_api
    volumes:
      - /Users/agu/work:/data
    build:
      context:  ./api
      args:
        KB_API_WAR: k-web-1.2.9.war 
        KB_API_URL: https://artifactory.b-aws.i.com
    ports:  
      - "8097:8080"
    depends_on:
      - db
    #command: [/usr/local/bin/wait-for-it.sh, "db:3306","-s","-t","0","--","/bin/sh" "wait_for_liquibase.sh"]
    links:
      - "db:kdb_docker_host"

在我的Dockerfile for api中我有一个名为“wait_for_liquibase.sh”的shell脚本的入口点

CMD ["wait_for_liquibase.sh"]

wait_for_liquibase.sh:

#!/bin/sh
set -e


#RUN liquibase
mvn clean install -X  -PdropAll -Dcontexts=test -Dliquibase.user=XX -Dliquibase.pass=XX -Dliquibase.host=db -Dliquibase.port=3306 -Dliquibase.schema=knowledgebasedb -DpromptOnNonLocalDatabase=false -Dcontexts=test -f k/k-liquibase

/usr/local/tomcat/bin/catalina.sh run

问题是一旦数据库容器启动并且运行应用程序容器无法访问数据库服务器以执行数据库的liquibase设置。我看到以下错误。

通信失败:未知数据库主机-Dliquibase.host = db。

2 个答案:

答案 0 :(得分:1)

我假设您使用的是版本1.

你给你的" db"服务,您需要使用该别名kdb_docker_host

此外,端口映射到主机,要在容器之间公开端口,因此需要使用expose属性。

expose:
  - 3306

答案 1 :(得分:0)

我在Docker文件RUN apt-get update RUN apt-get install netcat -y ADD wait-for-base.sh /wait-for-base.sh CMD ["/wait-for-base.sh"]

中使用了它

并在wait-for-base.sh中:

#!/bin/bash

while ! nc -z db 3306; do sleep 3; done
[my command to run]

在您的情况下/usr/local/tomcat/bin/catalina.sh run