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

时间:2018-06-07 07:59:39

标签: mysql docker docker-compose dockerfile

我希望使用初始化数据库构建一个docker镜像。 此初始数据将包含默认客户参考值' XXX'。

这是我的Dockerfile:

     body { 
  background:  url("/images/laptop_bg.jpg");
  -webkit-background-size: cover;
  -moz-background-size: cover;
  -o-background-size: cover;
  background-size: cover;
  background-repeat: no-repeat;
  font-family: 'Proxima Nova', Georgia, sans-serif;
 }

html{
  height: 100%;
}

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

因此要运行的更新查询类似于:

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

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

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

1 个答案:

答案 0 :(得分:0)

你是对的, 您希望持久化的所有内容都应位于docker-compose文件的Dockerfilebuild:部分。

由于您希望仅在docker rundocker-compose up阶段进行更新,因此可以使用CMD或ENTRYPOINT执行更新。 有几种方法,但我建议采用以下方法:

<强>搬运工-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内定义。因此,如果您想更改更新,则无需重建图像。

  • 你的mysql-env-file.env只是在里面定义了你的MYSQL env变量。

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

我希望这对你有所帮助。