[英]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服务器本身,因此您无法直接在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集群中的其他服务器,以免你的状态失去同步。官方Docker Hub mysql
为非集群数据库服务器执行此操作;请参阅其相关的入口点脚本以获取创意。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.