Dockerfile - 在入口点部署 mysql 转储
Posted
技术标签:
【中文标题】Dockerfile - 在入口点部署 mysql 转储【英文标题】:Dockerfile - deploy mysql dump in entrypoint 【发布时间】:2018-07-07 14:40:54 【问题描述】:是否可以在入口点连接到外部容器并将数据库转储上传到它?
我总是得到 web_1 exited with code 0 在这一行执行:mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE
但是,我可以在创建容器后执行 docker exec -it bash,在那里执行 install-sampledata 并且它可以工作
我有这样的 docker-compose
version: '2.1'
services:
db:
image: mysql:5.6.23
volumes:
- db-data:/var/lib/mysql/data
env_file:
- env
web:
build: .
ports:
- "8089:80"
links:
- db
env_file:
- env
tty: true
volumes:
db-data:
Dockerfile
FROM alexcheng/magento
ENTRYPOINT install-sampledata
并安装示例数据文件
#!/usr/bin/env bash
cd /tmp
cp /opt/magento-sample-data-1.9.1.0.tgz .
tar xvf magento-sample-data-1.9.1.0.tgz
cp -R magento-sample-data-1.9.1.0/media/* /var/www/htdocs/media/
cp -R magento-sample-data-1.9.1.0/skin/* /var/www/htdocs/skin/
chown -R www-data:www-data /var/www/htdocs/media
mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE < magento-sample-data-1.9.1.0/magento_sample_data_for_1.9.1.0.sql
【问题讨论】:
【参考方案1】:问题是:您的ENTRYPOINT
是install-sampledata
:一个脚本将运行一个mysql 命令并...退出!
此时容器将停止。
如果可能,最好调用该脚本,然后调用call mysql as in the mysql Dockerfile,以便让前台进程继续运行。
或者您可以查看multi-stage build,以便使用您的先决条件文件构建映像。
【讨论】:
为什么容器 web 会停止?据我所知,mysql 正在开发 db 容器。 Web 容器使用 mysql -h db .. 连接到它并上传转储。就这样。那么,为什么 web 容器会停止呢? @freento 容器生命周期背后的所有想法是,只要它的主进程运行,它就会运行。在你的情况下,你的主要过程是一个简单的命令。一旦该命令完成,它就会停止。【参考方案2】:您在 mysql 容器中有一个入口点,允许您让容器在启动时使用您的 mysql 转储。在此处创建一个卷 /docker-entrypoint-initdb.d ,您的容器将填充您的数据库。
【讨论】:
【参考方案3】:添加
sh -c /bin/bash
最后到您的 install-sampledata 脚本。它将使用新的 pid 启动一个新的进程 bash。所以你的容器不会死。
【讨论】:
以上是关于Dockerfile - 在入口点部署 mysql 转储的主要内容,如果未能解决你的问题,请参考以下文章
ENTRYPOINT/CMD process 入口点进程是什么?Docker容器Dockerfile entrypoint.sh文件作用,为什么在脚本开头要执行source ~/.bashrc?
ENTRYPOINT/CMD process 入口点进程是什么?Docker容器Dockerfile entrypoint.sh文件作用,为什么在脚本开头要执行source ~/.bashrc?