从纯粹的机械角度来看,引号引起了麻烦。当你说
RUN "sh test.sh"
它试图运行一个名为
sh test.sh;它不会尝试将
sh其
test.sh作为参数运行。以下任何内容都将实际运行脚本
RUN ["sh", "test.sh"]RUN sh test.shRUN chmod +x test.sh; ./test.sh
在操作级别上,您将很难在服务器容器中运行该命令。最大的问题是服务器已经启动并运行后,您需要运行该命令。因此,您根本无法在Dockerfile中运行它(
RUN命令中从未运行过任何服务)。容器运行的一个过程,你需要这个过程是Elasticsearch服务器本身,所以你不能这样做直接
ENTRYPOINT或
CMD两种。
最简单的路径是从主机运行此命令:
docker build -t my/elasticsearch .docker run -d --name my-elasticsearch -p 9200:9200 my/elasticsearchcurl http://localhost:9200 # is it alive?./test.sh
如果您具有Docker
Compose设置,则还可以从单独的容器中运行它,或者可以在启动应用程序容器时运行它。在运行中的
ENTRYPOINT应用程序容器的脚本中有一些运行数据库迁移的良好示例,这基本上就是您要寻找的模式。
(从 理论上讲, 可以在入口点脚本中运行它。您必须启动服务器,等待其启动,运行脚本,停止服务器,然后最终
exec"$@"运行
CMD。)对于Elasticsearch而言,这比较棘手可能需要连接到同一Elasticsearch集群中的其他服务器,以免导致状态不同步。
mysql对于非集群数据库服务器,官方Docker
Hub会这样做;请参阅其颇为复杂的入口点脚本以获取想法。)



