簡體   English   中英

在Docker容器中初始化MySQL數據

[英]Initialize MySQL data in Docker Container

我試圖通過docker-compose創建Node.js容器和MySQL容器,所以我在下面編寫了文件。

tree

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

○。/搬運工-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 ./mysql/init/create.sql sudo docker-compose up --build -d時都會執行,因此一旦我通過sudo docker-compose down刪除容器並通過sudo docker-compose up --build -d重新創建容器sudo docker-compose up --build -d 但是當我檢查test.users ,有三個元組(create.sql插入兩個元組)。

我的想法(每當我運行sudo docker-compose up --build -d ./mysql/init/create.sql sudo docker-compose up --build -d時都會執行./mysql/init/create.sql )嗎?

/docker-entrypoint-initdb.d中的腳本僅在MySQL數據目錄不存在且正在啟動容器以實際運行mysqld運行。 請參閱入口點腳本的這一部分映像文檔 “初始化新實例”。

如果要重新運行它,則需要使Docker Compose刪除並重新創建數據卷。 我相信docker-compose rm會做到的; 簡單地downup不會。

(如果您的應用程序具有更復雜的遷移系統,則在入口點腳本中運行遷移似乎相當普遍,而且我覺得我最近看到的SO示例都圍繞Python Django框架進行,盡管特定命令,這是一種有用的通用技術。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM