如何在构建另一个容器期间填充 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 中定义的每个服务的映像 =] 文件(在你的例子中 mysqlmyapplication),所以这意味着没有容器是 运行.

执行 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;"