为我的数据库创建 Docker 容器
Creating Docker Container for my database
我有两个问题。
- 如果我在 Docker 文件的
FROM
命令中添加 MySQL 图像,是否
运行 MySQL 图片的 entrypoint
和 CMD
?我找不到
有关的文档。
- 如何通过
Docker文件?
我正在尝试创建可重现的开发数据库容器。目前我使用 docker exec
命令导入数据库,但我更愿意将其合并为一个步骤。
这是我创建的 Docker 文件的内容。
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 服务器甚至没有 运行ning,这让我觉得 none 父图像的命令是 运行?
我在 MySQL Docker 注册表评论页面找到了 CMD
建议,但我显然做错了。
如有任何帮助,我将不胜感激。谢谢!
- If I add the MySQL image in my Dockerfile's FROM command, does it run the
ENTRYPOINT
and CMD
of the MySQL image?
是的,只要您不在 Dockerfile 中添加自己的 ENTRYPOINT
或 CMD
指令。
- How can I create a reproducible development database container via a Dockerfile?
您缺少的是了解何时 RUN
, ENTRYPOINT
and CMD
被执行。
RUN
指令在 构建时间 中执行。当你做 docker build ...
.
ENTRYPOINT
和 CMD
指令仅在 运行 时间 执行。当你做 docker run
或 docker start
.
有了这些知识,现在很清楚为什么没有 MySQL 服务器在构建时 运行ning。因此,您无法在构建时将数据导入 MySQL 服务器。
但是,您可以做的是保留 COPY
指令,以便要启动的容器将准备好导入 sql 数据,然后还提供您自己的入口点脚本,它将有责任(在 运行 时间)执行 MySQL 图像提供的 /entrypoint.sh
脚本,然后导入您的 sql 数据。
在 Dockerfile
旁边创建以下 my-custom-entrypoint.sh
文件
#!/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 文件的
FROM
命令中添加 MySQL 图像,是否 运行 MySQL 图片的entrypoint
和CMD
?我找不到 有关的文档。 - 如何通过 Docker文件?
我正在尝试创建可重现的开发数据库容器。目前我使用 docker exec
命令导入数据库,但我更愿意将其合并为一个步骤。
这是我创建的 Docker 文件的内容。
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 服务器甚至没有 运行ning,这让我觉得 none 父图像的命令是 运行?
我在 MySQL Docker 注册表评论页面找到了 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
and CMD
被执行。
RUN
指令在 构建时间 中执行。当你做 docker build ...
.
ENTRYPOINT
和 CMD
指令仅在 运行 时间 执行。当你做 docker run
或 docker start
.
有了这些知识,现在很清楚为什么没有 MySQL 服务器在构建时 运行ning。因此,您无法在构建时将数据导入 MySQL 服务器。
但是,您可以做的是保留 COPY
指令,以便要启动的容器将准备好导入 sql 数据,然后还提供您自己的入口点脚本,它将有责任(在 运行 时间)执行 MySQL 图像提供的 /entrypoint.sh
脚本,然后导入您的 sql 数据。
在 Dockerfile
my-custom-entrypoint.sh
文件
#!/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"]