Инициализируйте данные MySQL в контейнере Docker - PullRequest
0 голосов
/ 31 января 2019

Я попытался создать Node.js Container и MySQL Container с помощью docker-compose, поэтому я написал следующие файлы.

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 mysql -h 127.0.0.1 -u user -p.И в базе данных 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 голосов
/ 31 января 2019

Сценарии в /docker-entrypoint-initdb.d запускаются только в том случае, если каталог данных MySQL не существует и контейнер запускается для фактического запуска mysqld.См. эту часть сценария точки входа и "Инициализация свежего экземпляра" в документации изображения .

Если вы хотите перезапустить его, вам нужно вызватьDocker Compose для удаления и воссоздания тома данных.Я верю, что docker-compose rm сделает это;просто down и up не будет.

(Если ваше приложение имеет более сложную систему миграции, кажется, что довольно часто запускать миграции в сценарии точки входа, и я чувствую, что SOВсе примеры, которые я видел недавно, были посвящены среде Python Django, хотя помимо конкретной команды это полезный общий метод.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...