嗨,我正在構建一個需要 Mysql/MariaDB 資料庫的服務。我一直在谷歌搜索不同的解決方案,并且由于遵循的指南(不幸的是再也找不到鏈接)而創建了資料庫,因此我開始使用資料庫。
問題
我遇到的問題是沒有創建表。我將 sql-scema 檔案添加到 /docker-entrypoint-initdb.d/ (您可以在 docker 檔案中檢查它),但它似乎沒有執行它(我已嘗試使用復制和 ADD 命令)。電流輸出
這是容器的當前控制臺輸出:[![image][1]][1]
資料庫已創建,但 SOW TABLES;命令回傳空集。
期望的輸出
由于此資料庫將成為不同腳本連接到的服務(當前為 python),因此我需要能夠創建資料庫和 sql 架構(表、觸發器等),以便我的團隊可以使用相同的配置。我嘗試過的一些解決方案(我無法找到我訪問過的所有鏈接)
如何將 mysql 轉儲檔案匯入 Docker mysql 容器
mysql:5.7 docker 允許從所有主機訪問并創建資料庫
無法連接到 docker 容器外的 mariadb
在 docker-compose 中使用卷時,Mariadb 表被洗掉
專案結構
結構非常簡單,我使用的是以下 docker-compose.yml碼頭工人組成
如果這里需要 MARIADB_ 環境變數,我仍然需要嘗試。version: '3'
services:
db-mysql:
#image: mysql/mysql-server:latest
build: ./mysql-db
restart: always
container_name : db-music
ports:
- '3306:3306'
environment:
MYSQL_ROOT_PASSWORD: pwd
MYSQL_DATABASE : audio_service
MYSQL_USER : user
MYSQL_PASSWORD : password
environment:
MARIADB_ROOT_PASSWORD: pwd
MARIADB_DATABASE : audio_service
MARIADB_USER : user
MARIADB_PASSWORD : password
#https://stackoverflow.com/questions/29145370/how-can-i-initialize-a-mysql-database-with-schema-in-a-docker-container?rq=1
expose:
- '3306:3306'
volumes:
- type: bind
source : E:\python-code\Rockstar\volume\mysql
target : /var/lib/mysql
#- type: bind
#source : E:\python-code\Rockstar\mysql-db\sql_scripts\tables.sql
#target : /docker-entrypoint-initdb.d/init.sql
networks:
net:
ipam:
driver: default
config:
- subnet: 212.172.1.0/30
host:
name: host
external: true
Dockerfile
FROM mariadb:latest as builder
# That file does the DB initialization but also runs mysql daemon, by removing the last line it will only init
RUN ["sed", "-i", "s/exec \"$@\"/echo \"not running $@\"/", "/usr/local/bin/docker-entrypoint.sh"]
# needed for intialization
ENV MYSQL_ROOT_PASSWORD=root
ENV MYSQL_ROOT_PASSWORD = pwd
ENV MYSQL_DATABASE = audio_service
ENV MYSQL_USER = user
ENV MYSQL_PASSWORD = password
COPY sql_scripts/tables.sql /docker-entrypoint-initdb.d/
# Need to change the datadir to something else that /var/lib/mysql because the parent docker file defines it as a volume.
# https://docs.docker.com/engine/reference/builder/#volume :
# Changing the volume from within the Dockerfile: If any build steps change the data within the volume after
# it has been declared, those changes will be discarded.
RUN ["/usr/local/bin/docker-entrypoint.sh", "mysqld", "--datadir", "/initialized-db", "--aria-log-dir-path", "/initialized-db"]
FROM mariadb:latest
# needed for intialization
ENV MARIADB_ROOT_PASSWORD=root
ENV MARIADB_ROOT_PASSWORD = pwd
ENV MARIADB_DATABASE = audio_service
ENV MARIADB_USER = user
ENV MARIADB_PASSWORD = password
COPY --from=builder /initialized-db /var/lib/mysql
EXPOSE 3306
SQL 模式檔案
create database audio_service;
use audio_service;
CREATE TABLE audio
(
audio_id BINARY(16),
title TEXT NOT NULL UNIQUE,
content MEDIUMBLOB NOT NULL,
PRIMARY KEY (audio_id)
) COMMENT='this table stores sons';
DELIMITER ;;
CREATE TRIGGER `audio_before_insert`
BEFORE INSERT ON `audio` FOR EACH ROW
BEGIN
IF new.audio_id IS NULL THEN
SET new.audio_id = UUID_TO_BIN(UUID(), TRUE);
END IF;
END;;
DELIMITER ;
uj5u.com熱心網友回復:
mysql由于官方/mariadb影像已經非常適合,因此無需構建自己的影像。您只需要按照其影像檔案中的說明使用以下命令運行它們:
- 在第一次運行時使用相應用戶初始化新資料庫的環境變數
- 保存資料的卷
/var/lib/mysql - 安裝到的任何初始化/sql 腳本
/docker-entrypoint-initdb.d
因此,將您的 SQL* 存盤到以下schema.sql檔案旁邊的檔案docker-compose.yml中就足以實作您想要的:
# docker-compose.yml
services:
db:
image: mariadb
environment:
MARIADB_ROOT_PASSWORD: pwd
MARIADB_DATABASE: audio_service
MARIADB_USER: user
MARIADB_PASSWORD: password
volumes:
# persist data files into `datadir` volume managed by docker
- datadir:/var/lib/mysql
# bind-mount any sql files that should be run while initializing
- ./schema.sql:/docker-entrypoint-initdb.d/schema.sql
volumes:
datadir:
*請注意,您可以從您的中洗掉CREATE DATABASEandUSE陳述句,schema.sql因為無論如何這些將由 init 腳本自動為您完成
您自己的設定無法按預期作業有兩個原因:
COPY --from=builder /initialized-db /var/lib/mysql由于您在評論中描述的相同原因,該行無法按預期作業:/var/lib/mysql是一個卷,因此在定義后的構建步驟中沒有新檔案存盤在其中。您正在系結安裝
E:\python-code\Rockstar\volume\mysql到/var/lib/mysql您的docker-compose.yml. 但這將有效地覆寫影像的任何內容/var/lib/mysql,即雖然您自己的影像構建自您的Dockerfile確實E:\python-code\Rockstar\volume\mysql包含一個初始化的資料庫,但它會在啟動服務時被內容覆寫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/442569.html
上一篇:AWSElasticBeanstalkRDSMacOSmysqlclient不作業
下一篇:SQLException:沒有為jdbc:mysql找到合適的驅動程式。SQLState:08001。供應商錯誤:0
