AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 796762
Accepted
Tom Klino
Tom Klino
Asked: 2016-08-15 10:12:52 +0800 CST2016-08-15 10:12:52 +0800 CST 2016-08-15 10:12:52 +0800 CST

使用准备好的数据库方案创建 docker mysql 容器

  • 772

我想在 mysql 上创建一个 docker 镜像,该镜像已经包含我的应用程序所需的方案。

我尝试向 Dockerfile 添加行,将我的方案作为 sql 文件导入。我是这样做的(我的 Dockerfile):

FROM mysql

ENV MYSQL_ROOT_PASSWORD="bagabu"
ENV MYSQL_DATABASE="imhere"

ADD imhere.sql /tmp/imhere.sql

RUN "mysql -u root --password="bagabu" imhere < /tmp/imhere.sql"

据我了解,这不起作用,因为 mysql docker 映像不包含 mysql 客户端(最佳实践状态“不要添加东西只是因为它们会很好”)(我错了吗?)

什么可能是这样做的好方法?我有一些想法,但它们似乎都是混乱的解决方法。

  1. 安装 mysql 客户端,做我必须做的事情,然后删除/清除它。
  2. 将 mysql 客户端二进制文件复制到映像中,做我必须做的,然后将其删除。
  3. 在另一个 sql server 中创建模式并直接复制 db 文件本身(这看起来很混乱,对我来说听起来像是一个受污染的问题池)

有什么建议么?希望以一种以后易于维护的方式,并且可能也符合最佳实践?

mysql docker
  • 7 7 个回答
  • 116849 Views

7 个回答

  • Voted
  1. Best Answer
    Martin Roy
    2018-06-09T13:34:21+08:002018-06-09T13:34:21+08:00

    为了测试目的,我不得不这样做。

    以下是我利用 dockerhub 上的实际 MySQL/MariaDB 映像和多阶段构建的方法:

    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
    
    COPY setup.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
    
    COPY --from=builder /initialized-db /var/lib/mysql
    

    完整的工作示例:https ://github.com/lindycoder/prepopulated-mysql-container-example

    • 30
  2. Greg Dubicki
    2016-08-15T14:23:47+08:002016-08-15T14:23:47+08:00

    您应该将您的 init 脚本放在安装为的目录中- 请参阅MySQL Docker 映像文档/docker-entrypoint-initdb.d中的“初始化新实例”部分。

    • 26
  3. Venkateswara Rao
    2019-03-07T03:35:30+08:002019-03-07T03:35:30+08:00

    感谢@Martin Roy

    对 mysql 进行了微小的更改...

    内容 Dockerfile

    FROM mysql: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
    
    COPY setup.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"]
    
    FROM mysql:latest
    
    COPY --from=builder /initialized-db /var/lib/mysql
    

    内容 setup.sql

    CREATE DATABASE myexample;
    
    USE myexample;
    
    CREATE TABLE mytable (myfield VARCHAR(20));
    
    INSERT INTO mytable VALUES ('Hello'), ('Dolly');
    

    完整的工作示例:https ://github.com/iamdvr/prepopulated-mysql-container-example

    • 9
  4. Jonas Wahlfrid
    2020-10-02T12:38:48+08:002020-10-02T12:38:48+08:00

    这是可行的,它遵循 mariadb 入口点脚本的接口。包含设置、表格、数据和用户的文件被复制到文件夹中。当容器启动时,入口点脚本会找到文件并创建一个新数据库。

    FROM mariadb:10.5.5
    
    ENV MYSQL_ROOT_PASSWORD=blablablablablabla
    
    COPY settings/my.cnf /etc/mysql/conf.d
    # comment out !includedir /etc/mysql/conf.d/ to stop recursion
    RUN sed -i 's/!includedir \/etc\/mysql\/conf\.d\//#!includedir \/etc\/mysql\/conf\.d\//' /etc/mysql/conf.d/my.cnf
    COPY db_scripts/db_setup.sql /docker-entrypoint-initdb.d/
    COPY db_scripts/db_data.sql.template /docker-entrypoint-initdb.d/db_template.sql
    COPY db_scripts/db_users.sql /docker-entrypoint-initdb.d/
    
    # Note the port 3306 can be exposed
    
    • 2
  5. Rohit Salecha
    2020-01-19T02:45:54+08:002020-01-19T02:45:54+08:00

    这是我的 docker 文件工作得很好。/sql-scripts/ 将包含您的自定义 sql 文件(包含您准备好的数据库),该文件在容器运行后执行。不过,您可能想查看卷安装。

    FROM mysql:5.6
    COPY ./sql-scripts/ /docker-entrypoint-initdb.d/
    
    • 0
  6. hamx0r
    2021-07-17T14:39:50+08:002021-07-17T14:39:50+08:00

    @Venkateswara Rao 和 @Martin Roy 的答案非常有用,如果您不关心对 dockerized 数据库的更改是否仍放在卷中。就我而言,我想要一个预填充数据的 Docker 映像,但在我们经常进行数据库迁移的项目中。因此,我想偶尔创建一个数据库容器,运行迁移,然后以某种方式将这些更改推送回去,以便下一个使用数据库映像的用户已经应用了迁移。由于数据库文件存在于卷中,因此它们不会卷入带有docker commmit my-migrated-db-container my-new-db-image.

    我的解决方案是使用官方MySQL(在我的情况下为 5.6)Dockerfile(和入口点文件VOLUME /var/lib/mysql)在删除该行后重新创建他们的工作。然后,从生成的图像中,我使用 Venkateswara 的文件制作了一个预加载的数据库图像,其中甚至所有未来的数据库数据都存储在容器本身(而不是卷上)中。

    注意:链接的 Dockerfile 文件是旧的,指的是过时的 GPG 密钥服务器(即keys.openpgp.org)。您可以将这些服务器名称替换为keyserver.ubuntu.com.

    • 0
  7. Patrick
    2016-08-15T12:34:47+08:002016-08-15T12:34:47+08:00

    Ansible 等管理软件可以帮助您轻松自动导入 mysql,而无需安装和重新安装客户端。Ansible 具有强大的内置功能来管理 docker 镜像和容器以及 mysql 数据库。

    • -1

相关问题

  • 开源与专有关系 db mgt 系统的优缺点是什么?

  • 在 solaris 10 上为 mysql 设置 max_allowed_pa​​cket

  • 如何移动 MySQL 的数据目录?

  • 通过 VPN 连接什么是远程服务器 IP?

  • mysql崩溃

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve