在Docker容器中初始化MySQL数据

时间:2019-01-31 09:01:54

标签: mysql docker docker-compose

我试图通过docker-compose创建Node.js容器和MySQL容器,所以我写了下面的文件。

tree

.
├── docker-compose.yml
├── mysql
│   ├── Dockerfile
│   ├── conf
│   │   ├── default_authentication.cnf
│   │   └── my.cnf
│   ├── data
│   └── init
│       └── create.sql
└── nodejs
    ├── Dockerfile
    └── app

○。/ docker-compose.yml

version: '3'
services: 
  webserver:
    build: nodejs
    image: node-express-dev:1.0
    container_name: nodejs
    tty: true
    volumes:
      - ./nodejs/app:/app
    ports:
      - "8080:3000"
  db:
    build: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/init:/docker-entrypoint-initdb.d
      - dbata:/var/lib/mysql
      - ./mysql/conf:/etc/mysql/conf.d
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_USER: user
      MYSQL_PASSWORD: mysql
volumes:
  dbata:
    driver_opts:
      type: none
      device: /home/.../mysql/data
      o: bind

○。/ mysql / Dockerfile

FROM mysql:latest

RUN mkdir -p /var/log/mysql/

RUN touch /var/log/mysql/mysqld.log

○。/ mysql / init / create.sql

SET CHARSET UTF8;
DROP DATABASE IF EXISTS test;
CREATE DATABASE test DEFAULT CHARACTER SET utf8;

use test;

SET CHARACTER_SET_CLIENT = utf8;
SET CHARACTER_SET_CONNECTION = utf8;

DROP TABLE IF EXISTS users;
CREATE TABLE users(
id INT,
name VARCHAR(20),
byear INT
);

INSERT INTO users VALUES (1, 'user1', 1995);
INSERT INTO users VALUES (2, 'user2', 1995);

GRANT ALL ON *.* TO 'user';

然后我使用sudo docker-compose up --build -d并通过mysql -h 127.0.0.1 -u user -p访问MySQL。然后在数据库test中,向用户表中插入一个元组。

我认为./mysql/init/create.sql会在每次运行sudo docker-compose up --build -d时执行,因此一旦我通过sudo docker-compose down删除容器并通过sudo docker-compose up --build -d重新创建容器。但是当我检查test.users时,有三个元组(create.sql插入两个元组)。

我的想法(./mysql/init/create.sql在我每次运行sudo docker-compose up --build -d时都会执行)是错误的吗?

1 个答案:

答案 0 :(得分:0)

/docker-entrypoint-initdb.d中的脚本仅在MySQL数据目录不存在且正在启动容器以实际运行mysqld的情况下运行。请参阅this part of the entrypoint scriptthe image documentation中的“初始化新实例”。

如果要重新运行它,则需要使Docker Compose删除并重新创建数据卷。我相信docker-compose rm会做到的; downup不会。

(如果您的应用程序具有更复杂的迁移系统,则在入口点脚本中运行迁移似乎很普遍,而且我觉得最近看到的SO示例都围绕Python Django框架进行,尽管超出了特定命令,但它是一种有用的通用技术。)