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

Docker应用程序无法与数据库容器通信,docker,docker-compose,dockerfile,Docker,Docker Compose,Dockerfile,我在一个容器中运行mysql DB,在另一个容器中运行web应用程序。我的使用案例是,一旦DB容器启动并运行应用程序容器,就必须使用Liquibase向DB插入一些初始数据并启动应用程序。我的码头工人yml如下所示 db: build: kdb user: "1000:50" volumes: - /data/mysql:/var/lib/mysql container_name: kdb environment: - MYSQ

我在一个容器中运行mysql DB,在另一个容器中运行web应用程序。我的使用案例是,一旦DB容器启动并运行应用程序容器,就必须使用Liquibase向DB插入一些初始数据并启动应用程序。我的码头工人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"
在api的Dockerfile中,我有一个shell脚本的入口点,名为“wait_for_liquibase.sh”

等待\u 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
问题是,一旦DB容器启动,并且运行的app container无法到达DB服务器以执行数据库的liquibase设置。我看到以下错误。


通信失败:未知数据库主机-Dliquibase.host=db。我假设您使用的是版本1

如果为“db”服务提供别名,则需要使用该别名,
kdb_docker_host

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

expose:
  - 3306

我在Docker文件
运行apt-get-update中使用了它
运行apt获取安装netcat-y
添加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

#!/bin/bash

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