Docker应用程序无法与数据库容器通信
我在一个容器中运行mysql DB,在另一个容器中运行web应用程序。我的使用案例是,一旦DB容器启动并运行应用程序容器,就必须使用Liquibase向DB插入一些初始数据并启动应用程序。我的码头工人yml如下所示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
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]