我有两个问题。
FROM
命令中添加MySQL镜像,是否可以运行MySQL镜像的
entrypoint
和CMD
?我找不到有关的文档。
Dockerfile?
我正在尝试创建可复制的开发数据库容器。当前,我使用
docker exec
命令导入数据库,但是我希望将其组合为一个步骤。这是我创建的Dockerfile的内容。
FROM mysql:5.5.44
COPY sql/devdb.sql /root/
CMD mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE < /root/devdb.sql
当我运行它时,出现错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
我发现MySQL服务器甚至没有运行,这使我认为没有运行父镜像的命令?
我在MySQL Docker Registry注释页面中找到了
CMD
建议,但是我显然做错了。我将不胜感激任何帮助。谢谢!
最佳答案
- If I add the MySQL image in my Dockerfile's FROM command, does it run the
ENTRYPOINT
andCMD
of the MySQL image?
是的,只要您不在自己的Dockerfile中添加自己的
ENTRYPOINT
或CMD
指令即可。
- How can I create a reproducible development database container via a Dockerfile?
您缺少的是了解执行
RUN
, ENTRYPOINT
和 CMD
时的情况。RUN
指令在构建时执行。当您执行docker build ...
时。ENTRYPOINT
和CMD
伪指令仅在运行时执行。当您执行docker run
或docker start
时。有了这些知识,现在很清楚为什么在构建时没有MySQL服务器正在运行。结果,您无法在构建时将数据导入MySQL服务器。
但是,您可以做的是保留
COPY
指令,以便要启动的容器将准备好导入sql数据,然后还提供您自己的入口点脚本,该脚本将负责(在运行时)执行 /entrypoint.sh
脚本由MySQL镜像提供,然后导入您的sql数据。在
my-custom-entrypoint.sh
旁边创建以下Dockerfile
文件#!/bin/bash
# first things first, call the MySQL image provided entrypoint script
# "$@" is to pass all parameters as they are provided
/entrypoint.sh "$@"
# then import the sql data
mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE < /root/devdb.sql
那么你的
Dockerfile
是FROM mysql:5.5.44
COPY sql/devdb.sql /root/
COPY my-custom-entrypoint.sh /
ENTRYPOINT ["/my-custom-entrypoint.sh"]
关于docker - 为我的数据库创建Docker容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31092870/