dockerfile创建mysql镜像并初始化后出错,如何解决?

求指导,想请问一下,我利用dockerfile创建mysql镜像并初始化,参照:

img

.sql如下:

img


buid.sh如下:

img


为什么进入容器后是bash.04且名下目录只有init.sql

【以下回答由 GPT 生成】

解决方案

根据你提供的信息,问题可能出在以下几个方面:

  1. Dockerfile中的基础镜像版本选择不当;
  2. 容器无法找到init.sql文件;
  3. 容器初始化脚本没有正确执行。

我们可以逐个排查这些问题并提供相应的解决方案:

1. Dockerfile中的基础镜像版本选择不当

MySQL镜像有多个版本可供选择,你在Dockerfile中使用的是"latest"标签,这可能导致问题。建议明确指定一个特定的MySQL版本。

FROM mysql:8.0
COPY init.sql /docker-entrypoint-initdb.d/

这样可以确保你使用的是稳定的MySQL版本。

2. 容器无法找到init.sql文件

在Dockerfile中使用COPY命令将init.sql复制到镜像中的/docker-entrypoint-initdb.d/目录。但是,容器的操作系统文件系统和主机的文件系统是相互独立的,所以在容器内部无法直接访问主机文件系统。

问题可能是你没有将init.sql文件放置在正确的位置,以便在构建镜像时可以找到它。你可以将init.sql文件与Dockerfile放在同一目录下,并确保执行build.sh时在正确的目录下。

- project
  - Dockerfile
  - init.sql
  - build.sh

3. 容器初始化脚本没有正确执行

当你构建并启动容器时,Docker会自动执行/docker-entrypoint-initdb.d/目录下的所有.sql和.sql.gz文件。根据你提供的信息,你的init.sql文件看起来是正确的。

如果这个目录下不存在其他.sql文件并且你仍然遇到问题,可能是与容器的启动、初始化过程有关。在这种情况下,你可以尝试使用自定义的entrypoint脚本,以在容器启动时运行特定的初始化命令。

创建一个名为docker-entrypoint.sh的新文件,该文件应该与Dockerfile和init.sql文件放置在同一目录下,并包含以下内容:

#!/bin/bash
/docker-entrypoint.sh mysqld &

echo "Waiting for MySQL to start"
until mysqladmin ping -h localhost --silent; do
  echo "MySQL is not still running..."
  sleep 1
done

echo "MySQL started"

mysql -h localhost -u root -p{YOUR_ROOT_PASSWORD} < /docker-entrypoint-initdb.d/init.sql

echo "Initialization completed"

# 下面是来自MySQL官方的entrypoint脚本的剩余代码
...(根据需要进行修改)

注意在上面的脚本中,你需要将{YOUR_ROOT_PASSWORD}替换为你自己的root密码。脚本会等待MySQL启动后,再执行初始化脚本。

修改Dockerfile,将新的entrypoint脚本复制到镜像中,并修改entrypoint为新的脚本:

FROM mysql:8.0
COPY docker-entrypoint.sh /docker-entrypoint.sh
COPY init.sql /docker-entrypoint-initdb.d/
RUN chmod +x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]

这样,当你重新构建并启动容器时,新的entrypoint脚本将被执行,并且init.sql文件将在MySQL启动后自动初始化。

重新执行build.sh脚本,它将使用新的Dockerfile构建镜像和容器。这次,你应该能够在容器内部找到bash,并且初始化脚本应该能够正确地执行。

希望这些解决方案能够帮助你解决问题。如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^