我正在制作一个dockerfile来安装elasticsearch:6.5.4并将少量文件添加到所需位置,并运行一个名为test.sh的脚本,以便在Elasticsearch运行时在elasticsearch中创建新索引。
我不确定是否应该使用RUN,CMD或ENTRYPOINT来执行此操作。
我已经通过注释最后一行(包含RUN / CMD / ENTRYPOINT test.sh)成功构建了映像并运行了容器。我能够从容器的bash运行test.sh并获得所需的结果。
但是,当我尝试为同一过程构建映像时,出现以下错误:
$ docker build -t es . Sending build context to Docker daemon 7.499MB Step 1/8 : FROM elasticsearch:6.5.4 ---> 93109ce1d590 Step 2/8 : WORKDIR /app ---> Running in 6b6412093d53 Removing intermediate container 6b6412093d53 ---> a374ab69eb1a Step 3/8 : ADD . /app ---> 6ed98ee7ad49 Step 4/8 : COPY test.sh . ---> 42184ec64c09 Step 5/8 : ADD analysis /usr/share/elasticsearch/config/analysis ---> 5a96f2098dd7 Step 6/8 : EXPOSE 9202 ---> Running in 6c44b54dcc77 Removing intermediate container 6c44b54dcc77 ---> d8723189c843 Step 7/8 : EXPOSE 9200 ---> Running in c571b4cba1fa Removing intermediate container c571b4cba1fa ---> 8fa11b03051e Step 8/8 : RUN "sh test.sh" ---> Running in cf2e8cb3fd37 /bin/sh: sh test.sh: command not found The command '/bin/sh -c "sh test.sh"' returned a non-zero code: 127
我为STEP 8尝试了RUN,CMD和ENTRYPOINT的不同组合
我的dockerfile如下:
FROM elasticsearch:6.5.4 WORKDIR /app ADD . /app COPY test.sh . ADD analysis /usr/share/elasticsearch/config/analysis EXPOSE 9202 EXPOSE 9200 RUN "sh test.sh"
我想在容器中运行elasticsearch并为Elasticsearch新建索引
从纯粹的机械角度来看,引号引起了麻烦。当你说
RUN "sh test.sh"
它试图运行一个名为sh\ test.sh;它不会尝试将sh其test.sh作为参数运行。以下任何内容都将实际运行脚本
sh\ test.sh
sh
test.sh
RUN ["sh", "test.sh"] RUN sh test.sh RUN chmod +x test.sh; ./test.sh
在操作级别上,您将很难在服务器容器中运行该命令。最大的问题是服务器已经启动并运行后,您需要运行该命令。因此,您根本无法在Dockerfile中运行它(RUN命令中从未运行过任何服务)。容器运行的一个过程,你需要这个过程是Elasticsearch服务器本身,所以你不能这样做直接ENTRYPOINT或CMD两种。
RUN
ENTRYPOINT
CMD
最简单的路径是从主机运行此命令:
docker build -t my/elasticsearch . docker run -d --name my-elasticsearch -p 9200:9200 my/elasticsearch curl http://localhost:9200 # is it alive? ./test.sh
如果您具有Docker Compose设置,则还可以从单独的容器中运行它,或者可以在启动应用程序容器时运行它。在运行中的ENTRYPOINT应用程序容器的脚本中有一些运行数据库迁移的良好示例,这基本上就是您要寻找的模式。
(从 理论上讲, 可以在入口点脚本中运行它。您必须启动服务器,等待其启动,运行脚本,停止服务器,然后最终exec "$@"运行CMD。)对于Elasticsearch而言,这比较棘手可能需要连接到同一Elasticsearch集群中的其他服务器,以免导致状态不同步。mysql对于非集群数据库服务器,官方Docker Hub会这样做;请参阅其颇为复杂的入口点脚本以获取想法。)
exec "$@"
mysql