Irf*_*run 4 bash elasticsearch docker dockerfile
我正在制作一个 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
Run Code Online (Sandbox Code Playgroud)
我已经为 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"
Run Code Online (Sandbox Code Playgroud)
我想在容器中运行 elasticsearch 并为 elasticsearch 创建一个新索引
在纯粹的机械层面上,报价造成了麻烦。当你说
RUN "sh test.sh"
Run Code Online (Sandbox Code Playgroud)
它尝试运行一个名为sh\ test.sh; 它不会尝试运行sh与test.sh作为参数。以下任何一项都将实际运行脚本
RUN ["sh", "test.sh"]
RUN sh test.sh
RUN chmod +x test.sh; ./test.sh
Run Code Online (Sandbox Code Playgroud)
在操作层面上,在服务器容器中运行该命令会遇到很多麻烦。最大的问题是您需要在服务器启动并运行后运行该命令。所以你根本不能在 Dockerfile 中运行它(没有服务在RUN命令中运行)。容器运行的一个过程,你需要这个过程是Elasticsearch服务器本身,所以你不能这样做直接ENTRYPOINT或CMD两种。
最简单的路径是从主机运行此命令:
RUN "sh test.sh"
Run Code Online (Sandbox Code Playgroud)
如果您有 Docker Compose 设置,您也可以从单独的容器运行它,或者您可以将它作为应用程序容器启动的一部分运行。有一些在ENTRYPOINT脚本中为运行的应用程序容器运行数据库迁移的很好示例,这基本上就是您正在寻找的模式。
(理论上可以在入口点脚本中运行它。您必须启动服务器,等待它启动,运行您的脚本,停止服务器,然后最后exec "$@"运行CMD.可能需要连接到同一个 Elasticsearch 集群中的其他服务器,以免您的状态不同步。官方 Docker Hubmysql为非集群数据库服务器执行此操作;有关想法,请参阅其相当复杂的入口点脚本。)
| 归档时间: |
|
| 查看次数: |
12376 次 |
| 最近记录: |