我正在构建一个具有父子依赖关系的应用程序,并且要构建我的应用程序,这是构建的最后阶段,我需要在构建阶段本身为其连接到mysql。 在此我得到错误:
原因:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接失败
我已经提到了我正在使用的docker文件代码,对于mysql,我已按照以下链接中的说明从dockerhub中提取了图像:
https://dev.mysql.com/doc/mysql-installation-excerpt/5.5/en/docker-mysql-getting-started.html
我正计划使用网桥将其作为单独的容器运行,以使用以下命令与我的上述容器通信:
docker run -d -name app-container-name --link mysql-container-name app-image-name
FROM maven:3.5.4-jdk-8 as maven
COPY ZP ZP
COPY CommonApp CommonApp
RUN cd ZP && mvn clean install
RUN cd CommonApp && mvn clean install package -U && mvn install:install-file -Dfile=/CommonApp/target/commonapp-0.0.1-SNAPSHOT.jar -DgroupId=com.z -DartifactId=commonapp -Dversion=0.0.1-SNAPSHOT -Dpackaging=jar;
FROM mysql:5.7
# ROOT PASSWORD
ENV MYSQL_ROOT_PASSWORD=root
ENV MYSQL_USER=root
ENV MYSQL_PASSWORD=root
ENV MYSQL_DATA_DIR=/var/lib/mysql \
MYSQL_RUN_DIR=/run/mysqld \
MYSQL_LOG_DIR=/var/log/mysql
RUN /etc/init.d/mysql start && \
mysql -u root -p$MYSQL_ROOT_PASSWORD -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root';FLUSH PRIVILEGES;"
#PORT
EXPOSE 3306
FROM maven:3.5.4-jdk-8
COPY ZCApp ZCApp
RUN cd ZCApp && mvn clean package -U
我应该如何解决这个问题。我该如何使用dockerfile与应用程序本身一起构建mysql ??
答案 0 :(得分:1)
构建Maven项目时出现相同的问题。与类似的请求的不同之处在于,这里您没有链接两个正在运行的容器,而是将执行构建过程的docker daemon链接到正在运行的容器。
要让Docker在构建期间访问数据库,您必须公开数据库端口。使用--link
无效,因为它链接了容器(并且您目前没有第二个容器)并且btw被认为是过时的技术。
您必须在构建过程之前显式启动数据库容器,并以某种方式将其端口公开给docker daemon以便访问它们。
首次启动数据库:
docker run -d --network=host mysql
然后构建:
docker built -t foo .
在构建过程中,Docker将在localhost
上看到数据库,因为数据库使用主机的网络并且不需要任何端口暴露。
首次启动数据库:
docker run -d -p 3306:3306 mysql
然后构建:
docker built -t foo .
在构建过程中,Docker将再次在localhost
上看到数据库,因为端口已暴露。
您需要仔细检查的是mvn
中的连接字符串。它必须使用localhost
和默认tcp端口3306