从Dockerfile构建期间部署mysql

时间:2019-02-15 09:53:42

标签: mysql docker dockerfile

我正在构建一个具有父子依赖关系的应用程序,并且要构建我的应用程序,这是构建的最后阶段,我需要在构建阶段本身为其连接到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 ??

1 个答案:

答案 0 :(得分:1)

构建Maven项目时出现相同的问题。与类似的请求的不同之处在于,这里您没有链接两个正在运行的容器,而是将执行构建过程的docker daemon链接到正在运行的容器。

要让Docker在构建期间访问数据库,您必须公开数据库端口。使用--link无效,因为它链接了容器(并且您目前没有第二个容器)并且btw被认为是过时的技术。

您必须在构建过程之前显式启动数据库容器,并以某种方式将其端口公开给docker daemon以便访问它们。

选项1-使用主机联网。

首次启动数据库:

docker run -d --network=host mysql

然后构建:

docker built -t foo .

在构建过程中,Docker将在localhost上看到数据库,因为数据库使用主机的网络并且不需要任何端口暴露。

选项2-暴露端口

首次启动数据库:

docker run -d -p 3306:3306 mysql

然后构建:

docker built -t foo .

在构建过程中,Docker将再次在localhost上看到数据库,因为端口已暴露。

您需要仔细检查的是mvn中的连接字符串。它必须使用localhost和默认tcp端口3306