为我的数据库创建 Docker 容器

Creating Docker Container for my database

我有两个问题。

  1. 如果我在 Docker 文件的 FROM 命令中添加 MySQL 图像,是否 运行 MySQL 图片的 entrypointCMD?我找不到 有关的文档。
  2. 如何通过 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 建议,但我显然做错了。

如有任何帮助,我将不胜感激。谢谢!

  1. If I add the MySQL image in my Dockerfile's FROM command, does it run the ENTRYPOINT and CMD of the MySQL image?

是的,只要您不在 Dockerfile 中添加自己的 ENTRYPOINTCMD 指令。

  1. How can I create a reproducible development database container via a Dockerfile?

您缺少的是了解何时 RUN, ENTRYPOINT and CMD 被执行。

RUN 指令在 构建时间 中执行。当你做 docker build ....

ENTRYPOINTCMD 指令仅在 运行 时间 执行。当你做 docker rundocker 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"]