我正在尝试mysql
容器。该容器的CMD
参数为mysqld
。因此,以下参数是相同的。
docker run --name db -e MYSQL_ROOT_PASSWORD=proot --rm mysql
docker run --name db -e MYSQL_ROOT_PASSWORD=proot --rm mysql mysqld
现在,当我想使用多个命令时问题就到了。要在docker容器中使用多个命令,必须使用/bin/bash -c
。我只使用mysqld
命令来举例说明:
docker run --name db -e MYSQL_ROOT_PASSWORD=proot --rm mysql /bin/bash -c "mysqld"
此命令会引发以下错误。
mysqld: Table 'mysql.plugin' doesn't exist
然后mysql deamon停止了,我不明白原因。
我想使用/bin/bash -c
语法,因为我想使用多个命令,例如首先启动deamon,然后使用其他mysqld & some other command
。我不想创建另一个容器作为此问题的解决方法。
旁注:我正在使用--rm
因为我正在排除故障,否则我会使用-d
来分离容器。
答案 0 :(得分:0)
虽然mysql Docker镜像的CMD
为mysqld
,但它也有ENTRYPOINT ["docker-entrypoint.sh"]
,这可能与你的bash命令不兼容。
运行另一个进程会在某种程度上破坏使用此映像的意义,除了不是Docker容器的最佳实践之外,使其更不可变且更难调试,因此我不会真正使用另一个容器调用"替代方法" - 你正在尝试做的更多是解决方法。
因此,您可能需要覆盖ENTRYPOINT
或创建自定义Dockerfile。
答案 1 :(得分:0)
我得到了answer from the github community。他们说 entyrypoint脚本只执行 initdb
如果 mysqld
是参数 。如上所述,解决方法是使用/docker-entrypoint-initdb.d/
放置任何.sh
或.sql
个文件,然后在mysql
运行后运行文件。
因此,最后的答案是添加目录-v /local/dir:/docker-entrypoint-initdb.d/
以及要初始化的脚本。举个例子:
docker run --name db -v $(pwd):/docker-entrypoint-initdb.d/ -e MYSQL_ROOT_PASSWORD=proot --rm mysql