当前位置: 首页 > 面试题库 >

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

严承允
2023-03-14
问题内容

我正在制作一个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;它不会尝试将shtest.sh作为参数运行。以下任何内容都将实际运行脚本

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

在操作级别上,您将很难在服务器容器中运行该命令。最大的问题是服务器已经启动并运行后,您需要运行该命令。因此,您根本无法在Dockerfile中运行它(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集群中的其他服务器,以免导致状态不同步。mysql对于非集群数据库服务器,官方Docker
Hub会这样做;请参阅其颇为复杂的入口点脚本以获取想法。)



 类似资料:
  • 这是我的Dockerfile的内容。 当我运行Dockerfile来构建docker映像时,我得到以下错误: /bin/sh:1:sudo:未找到 你能帮我解决上面的错误吗?

  • 我有一个python代码和一个模型,是预先训练和有一个model.pkl文件与我在同一个目录中的代码我,现在我必须运行或部署这到aws sagemaker但没有得到任何解决方案由于aws sagemaker只支持两个命令,分别用于训练和部署。 目前,我正在使用命令“python filename.py”运行该程序,并且它正在成功运行。我希望在aws sagemaker上运行同样的程序。 有什么解决

  • 我有以下Dockerfile: 以及以下docker-compose.yml: 如果我通过docker cmd以以下方式手动运行Dockerfile: 看起来一切正常,我得到了它实际执行的应用程序输出日志: 但是,当我试图通过docker-comment以以下方式执行我的应用程序时: 我的应用程序似乎启动正常,但无法继续执行。以下是输出: 我尝试执行show logs命令: 但我得到的唯一记录是第

  • 在docker文件中运行sh脚本时,出现以下错误: /上传。上海:5:/上载sh:sudo:找不到/上载sh:21: /上载sh:换人不好 DockerFile 有什么想法吗?

  • 我很难弄明白这一点。 所以我有一个基于Ubuntu映像的dockerfile。在我的dockerfile的末尾,我有: 什么都没发生..docker ps显示没有正在运行的容器 但如果我跑: 容器开始运行,我在shell中,docker ps显示这个容器正在运行。所有工作都按预期进行,但我的django项目不在那里,我的理解是运行/bin/bash会覆盖dockerfile中的CMD,这意味着dj

  • 只有当docker容器尚未运行时,我才需要运行它。给了这个命令。如果它不存在,我将如何运行它。 我对任何脚本或语言都持开放态度。