我在一个容器中运行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。
答案 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