首页 文章

Docker mysql - 在映像启动时运行更新命令/脚本

提问于
浏览
0

我希望用初始化的数据库构建一个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 env varibles设置(MYSQL_ROOT_PASSWORD / MYSQL_ROOT_HOST / MYSQL_DATABASE / MYSQL_USER / MYSQL_PASSWORD),并希望引用另一个env var来设置所需的ref . 热衷于看到这可以作为原始命令和脚本来完成 .

1 回答

  • 0

    你是对的,你想要持久化的一切都应该在你的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 env变量,如果你需要它们 .

    • 请注意,我在docker-compose.yml中已经通过 image: 部分更改了dockerfile并将其更改为 volumes: ,但所有这些步骤也可以通过Dockerfile和 docker run 完成 .

    • 如果您不需要多个命令,只需将所有行更改为一个 .

    我希望这对你有所帮助 .

相关问题