我可以使用无花果来初始化docker中的持久化数据库吗?

我试图自动安装和运行一组链接的docker集装箱使用无花果。 这个configuration是由一个运行RStudio的容器组成的,这个容器链接到一个运行MySQL的容器,这样我就可以从RStudio查询MySQL数据库了。

在第一次运行时,我想从基础MySQL映像创buildMySQL容器,并用用户和数据库填充它。 从命令行来看,像这样:

#Get the latest database file wget -P /tmp http://ergast.com/downloads/f1db.sql.gz && gunzip -f /tmp/f1db.sql.gz #Create the database container with user, password and database docker run --name ergastdb -e MYSQL_USER=ergast -e MYSQL_ROOT_PASSWORD=mrd -e MYSQL_DATABASE=f1db -d mysql #Populate the database docker run -it --link=ergastdb:mysql -v /tmp:/tmp/import --rm mysql sh -c 'exec mysql -h$MYSQL_PORT_3306_TCP_ADDR -P$MYSQL_PORT_3306_TCP_PORT -uergast -pmrd f1db < /tmp/import/f1db.sql' #Fire up RStudio and link to the MySQL db docker run --name f1djd -p 8788:8787 --link ergastdb:db -d rocker/hadleyverse 

如果我可以预先加载数据库的图像,我想像下面的fig.yml脚本可以链接元素?

 gdrive: command: echo created image: busybox volumes: - "~/Google Drive/shareddata:/gdrive" dbdata: image: mysql_preloaded environment: MYSQL_USER=ergast MYSQL_ROOT_PASSWORD=mrd MYSQL_DATABASE=f1db rstudio: image: rocker/hadleyverse links: - dbdata:db ports: - "8788:8787" volumes_from: - gdrive 

我的问题是,我可以使用一步无花果步骤来创builddbdata容器,然后可能挂载一个持久性卷,链接到它并初始化数据库,大概是作为初始configuration的一部分。 如果我然后启动和停止容器,我不想再次运行数据库初始化步骤,只是链接到包含我以前安装的数据的数据容器容器。

我还注意到,MySQL泊坞窗图像看起来像支持任意datadir定义( 更新入口点直接从MySQLconfiguration读取DATADIR,而不是假设/ var / lib / docker )。 据我所知,MySQL图像的当前定义可防止在数据库容器中挂载(并因此持久化)数据库内容。 我想这可能使创build一个mysql_preloaded图像成为可能,但我不认为最新版本的MySQL docker脚本已经被推送到dockerhub了,我不能认为我的方式如何可以然后能够利用这种替代途径?

一些选项:

  1. 编辑fig.yml以运行与默认图像命令/入口点不同的自定义命令。

    http://www.fig.sh/yml.html (例如): command: bundle exec thin -p 3000

  2. 在本地启动容器,对其进行修改,然后将其提交为新图像。

  3. 修改MySQL图像docker-entrypoint.sh文件以执行您的自定义初始化。

    https://github.com/docker-library/mysql/blob/567028d4e177238c58760bcd69a8766a8f026e2a/5.7/docker-entrypoint.sh

难道你不能推出自己的MySQL泊坞窗图像版本吗? 来自MySQL“上游”的正式版本可以在https://github.com/mysql/mysql-docker/blob/mysql-server/5.7/Dockerfilefind 。如果你只是制作自己的副本,删除VOLUME行(第11行),然后你可以

 docker build -t my_mysql . docker run -d --name=empty_db my_mysql ... # add data to the database running in the container docker commit empty_db primed_db docker rm -v empty_db docker run -d --name=instance1 primed_db docker run -d --name=instance2 primed_db 

这应该让你两个运行“相同”,但完全孤立的实例。