【问题标题】:Docker mysql - run update command/script on image startupDocker mysql - 在映像启动时运行更新命令/脚本
【发布时间】:2018-11-17 01:15:09
【问题描述】:

我希望构建一个带有初始化数据库的 docker 镜像。 此初始数据将包含默认客户端引用值“XXX”。

这是我的 Dockerfile:

FROM mysql/mysql-server:5.7
COPY data.sql /docker-entrypoint-initdb.d/

在启动此图像的容器时,我需要将 ref 值替换为用户的特定值“ABCD”,该值将来自 docker compose 文件设置的环境变量。

所以要运行的更新查询类似于:

update client set ref='ABCD' where ref='XXX'

如何让 Dockerfile 执行此操作?我不认为它可以是一个 RUN 命令,因为我不希望更新成为映像构建的一部分,而是映像启动的一部分(如果它在每次启动时运行此更新就可以了)。

我设置了所有常用的 mysql 环境变量 (MYSQL_ROOT_PASSWORD/MYSQL_ROOT_HOST/MYSQL_DATABASE/MYSQL_USER/MYSQL_PASSWORD),并希望参考另一个环境变量来设置所需的 ref。热衷于看到这可以作为原始命令和脚本来完成。

【问题讨论】:

    标签: mysql docker docker-compose dockerfile


    【解决方案1】:

    你是对的, 您想要持久化的所有内容都应该在 docker-compose 文件的 Dockerfilebuild: 部分中。

    由于您只想在docker rundocker-compose up 阶段进行更新,您可以使用 CMD 或 ENTRYPOINT 执行它。 有几种方法,但我推荐以下一种:

    docker-compose.yml

    version: '3'
    
    services:
      your-service:
        env_file: ./your-mysql-env-file.env
        image: mysql/mysql-server:5.7
        volumes:
          - ./data.sql:/docker-entrypoint-initdb.d/data.sql
          - ./your-init-sql-commands.sql:/docker-entrypoint-initdb.d/your-init-sql-commands.sql
        container_name: your-container-name
        command:
          - /bin/bash
          - -c
          - |
              /etc/init.d/mysqld start
              mysql -u ${MYSQL_USER} -p ${MYSQL_PASSWORD} -h ${MYSQL_ROOT_HOST} ${MYSQL_DATABASE} < your-init-sql-commands.sql
              [other commands if needed...]
    
    • 请注意,您的update client set ref='ABCD' where ref='XXX' 应在your-init-sql-commands.sql 中定义。因此,如果您想更改更新,则无需重建映像。

    • your-mysql-env-file.env 只需在其中定义您的 MYSQL 环境变量(如果您需要它们)。

    • 请注意,我已在 docker-compose.yml 中将您的 dockerfile 更改为 image:section 并通过 volumes: 复制,但所有这些步骤也可以使用 Dockerfile 和 docker run 完成。
    • 如果您不需要多个命令,只需将所有行更改为一个即可。

    希望对你有帮助。

    【讨论】:

    • 但是 your-init-sql-commands.sql 不会在构建阶段运行吗?由于脚本已安装到入口点文件夹中,并且默认情况下所有 .sql 文件都在 db 初始化时运行?
    • 在命令部分定义 SQL 文件后,您的图像不会更改,您将在容器中进行更改。我想这就是你要找的东西,不是吗?
    • 我的数据库没有启动。我认为您的命令正在覆盖图像的启动。
    • mysql -u ${MYSQL_USER}...之前添加到命令/etc/init.d/mysql start
    • /etc/init.d/ 为空。镜像 dockerfile 的默认启动 cmd 是“mysqld”。理想情况下,我想启动 mysql 数据库,等待 20 秒以允许初始化完成,然后运行一些更新。通过 Dockerfile 尝试,除了“mysqld”之外的任何东西,数据库都无法启动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2019-04-09
    • 2017-10-18
    • 1970-01-01
    • 2018-04-14
    • 2019-06-11
    • 1970-01-01
    相关资源
    最近更新 更多