我正在尝试使用无花果自动安装和运行一组链接的docker容器。配置由运行RStudio的容器组成,该容器链接到运行MySQL的容器,这样我就可以从RStudio查询MySQL数据库。
首次运行时,我想从基础MySQL映像创建MySQL容器,并用用户和数据库填充它。从命令行,如下所示:
#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
我的问题是,我可以使用一次性无花果步骤来创建dbdata
容器,然后可能挂载一个持久卷,链接到它并初始化数据库,可能是初始{{1 }}。如果我然后启动和停止容器,我不想再次运行db初始化步骤,只需链接到包含我之前安装的数据的数据卷容器。
我还注意到MySQL docker图像看起来会支持任意fig up
定义(Update entrypoints to read DATADIR from the MySQL configuration directly instead of assuming /var/lib/docker)。据我了解,MySQL映像的当前定义可防止在数据库容器中安装(并因此持久化)数据库内容。我想这可能会创建一个datadir
图像,但我不认为最新版本的MySQL docker脚本已经被推送到dockerhub了,我不太想到我的方式如何无花果那么可能能够利用这种替代途径吗?
答案 0 :(得分:0)
一些选项:
编辑fig.yml以运行与默认图像命令/入口点不同的自定义命令。
来自http://www.fig.sh/yml.html(示例):
command: bundle exec thin -p 3000
在本地启动容器,修改它,然后将其作为新图像提交。
修改MySQL镜像docker-entrypoint.sh文件以进行自定义初始化。
答案 1 :(得分:0)
你不能只推出自己版本的MySQL泊坞窗映像吗?来自MySQL&#34;上游&#34;可在https://github.com/mysql/mysql-docker/blob/mysql-server/5.7/Dockerfile获取 如果你只是制作自己的副本,删除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
这应该让你有两个跑步&#34;相同&#34;但完全孤立的实例。