繁体   English   中英

如何使用dockerfile运行容器时运行.sh文件

[英]how to run .sh file when container is running using 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

我为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创建一个新索引

在你的问题进入小问题之后,我想你错过了一步,在运行实际脚本之前运行chmod +x test.sh命令,因为它可能无法在容器环境中执行。 另外,我个人更喜欢用bash运行shell脚本。

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 chmod +x test.sh
RUN bash test.sh

RUN "sh test.sh"

删除引号。 您的脚本将尝试运行名为sh test.sh的命令(带空格)。

在纯粹的机械水平上,报价引起了麻烦。 当你说

RUN "sh test.sh"

它试图运行一个名为sh\\ test.sh命令; 它不会尝试使用test.sh作为参数运行sh 以下任何一个都会实际运行该脚本

RUN ["sh", "test.sh"]
RUN sh test.sh
RUN chmod +x test.sh; ./test.sh

在操作级别,您在服务器容器中运行该命令时会遇到很多麻烦。 最大的问题是您需要在服务器启动并运行后运行该命令。 所以你根本不能在Dockerfile中运行它(没有服务在RUN命令中RUN )。 容器运行单个进程,您需要将该进程作为Elasticsearch服务器本身,因此您无法直接在ENTRYPOINTCMD执行此操作。

最简单的方法是从主机运行此命令:

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集群中的其他服务器,以免你的状态失去同步。官方Docker Hub mysql为非集群数据库服务器执行此操作;请参阅其相关的入口点脚本以获取创意。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM