如何在构建另一个容器期间填充 Mysql docker 容器?
How to populate a Mysql docker container during build of another container?
我正在尝试构建一个 docker-compose 文件,自动为我的应用程序构建一个容器,以及一个 mysql- 存储所有数据的容器。
在我的应用程序的 docker 文件中,我有一个脚本,它设置了应用程序 运行 所必需的所有数据库表和预设值。是否有可能以某种方式将 mysql 容器的引用传递给 myapplication,以便在构建 myapplication 期间它可以访问 mysql 容器?
如果可以,怎么办,如果不行,应该怎么办?
docker-compose.yml
mysql:
image: mysql/mysql-server
ports:
- "3306:3306"
environment:
MYSQL_USER: root
MYSQL_ROOT_PASSWORD: mysql-root-password
myapplication:
command: /home/myapplication/startup.sh
build: ./..
dockerfile: ./dockerfiles/myapplication
ports:
- "443:443"
- "8090:8090"
links:
- mysql:docker-mysql
environment:
MYSQL_SERVER: docker-mysql
我的应用程序-docker文件
FROM ubuntu:latest
EXPOSE 443
ENV applicationPath="/home/application“
COPY . ${applicationPath}
#Execute installationScript
RUN /bin/bash -c "./${applicationPath}/Tools/install_all.sh"
当执行 docker-compose build
命令时,docker 将只 构建 docker-[=43 中定义的每个服务的映像 =] 文件(在你的例子中 mysql
和 myapplication
),所以这意味着没有容器是 运行.
执行 docker-compose run
命令后,docker 将为之前构建的每个映像 运行 一个容器,一个用于 mysql
和另一个 myapplication
。现在两个都起来了,可以互相交流了
那么,我该怎么办?
我将在 运行 容器和执行 startup.sh 脚本之前执行 install_all.sh 脚本(猜测它包含数据库设置)。请注意,mysql
容器只有在启动时才能访问,这意味着只有在 docker-compose up
执行之后。
docker-compose.yml
...
myapplication:
command: bash -c "/home/myapplication/Tools/install_all.sh && /home/myapplication/startup.sh"
...
此外,请注意您的 myapplication
容器必须安装 mysql-客户端才能与 mysql 服务器通信。只需将以下行添加到您的 Dockerfile 中即可安装它:
RUN apt-get update && apt-get install mysql-client -y
并且在您的 install_all.sh script
中,您可以像下面这样调用 mysql(创建数据库):
#!/bin/bash
mysql -h $DOCKER_MYSQL_PORT_3306_TCP_ADDR -P $DOCKER_MYSQL_PORT_3306_TCP_PORT -u $DOCKER_MYSQL_ENV_MYSQL_USER -p $DOCKER_MYSQL_ENV_MYSQL_ROOT_PASSWORD -e "CREATE DATABASE IF NOT EXISTS new_database;"
我正在尝试构建一个 docker-compose 文件,自动为我的应用程序构建一个容器,以及一个 mysql- 存储所有数据的容器。
在我的应用程序的 docker 文件中,我有一个脚本,它设置了应用程序 运行 所必需的所有数据库表和预设值。是否有可能以某种方式将 mysql 容器的引用传递给 myapplication,以便在构建 myapplication 期间它可以访问 mysql 容器?
如果可以,怎么办,如果不行,应该怎么办?
docker-compose.yml
mysql:
image: mysql/mysql-server
ports:
- "3306:3306"
environment:
MYSQL_USER: root
MYSQL_ROOT_PASSWORD: mysql-root-password
myapplication:
command: /home/myapplication/startup.sh
build: ./..
dockerfile: ./dockerfiles/myapplication
ports:
- "443:443"
- "8090:8090"
links:
- mysql:docker-mysql
environment:
MYSQL_SERVER: docker-mysql
我的应用程序-docker文件
FROM ubuntu:latest
EXPOSE 443
ENV applicationPath="/home/application“
COPY . ${applicationPath}
#Execute installationScript
RUN /bin/bash -c "./${applicationPath}/Tools/install_all.sh"
当执行 docker-compose build
命令时,docker 将只 构建 docker-[=43 中定义的每个服务的映像 =] 文件(在你的例子中 mysql
和 myapplication
),所以这意味着没有容器是 运行.
执行 docker-compose run
命令后,docker 将为之前构建的每个映像 运行 一个容器,一个用于 mysql
和另一个 myapplication
。现在两个都起来了,可以互相交流了
那么,我该怎么办?
我将在 运行 容器和执行 startup.sh 脚本之前执行 install_all.sh 脚本(猜测它包含数据库设置)。请注意,mysql
容器只有在启动时才能访问,这意味着只有在 docker-compose up
执行之后。
docker-compose.yml
...
myapplication:
command: bash -c "/home/myapplication/Tools/install_all.sh && /home/myapplication/startup.sh"
...
此外,请注意您的 myapplication
容器必须安装 mysql-客户端才能与 mysql 服务器通信。只需将以下行添加到您的 Dockerfile 中即可安装它:
RUN apt-get update && apt-get install mysql-client -y
并且在您的 install_all.sh script
中,您可以像下面这样调用 mysql(创建数据库):
#!/bin/bash
mysql -h $DOCKER_MYSQL_PORT_3306_TCP_ADDR -P $DOCKER_MYSQL_PORT_3306_TCP_PORT -u $DOCKER_MYSQL_ENV_MYSQL_USER -p $DOCKER_MYSQL_ENV_MYSQL_ROOT_PASSWORD -e "CREATE DATABASE IF NOT EXISTS new_database;"