当前位置: 首页 > 知识库问答 >
问题:

Docker入口点中的命令

严正诚
2023-03-14

是否有一种方法可以在Dockerfile入口点中将命令作为参数执行?我正在创建一个映像,该映像应该自动运行mpirun处理器的数量,即mpirun-np$(nproc)mpirun-np$(Getconf_nprocessors_onln)

ENTRYPOINT ["/tini", "--", "mpirun", "-np", "4"] # works
ENTRYPOINT ["/tini", "--", "mpirun", "-np", "$(nproc)"] # doesn't work
ENTRYPOINT ["/tini", "--", "mpirun", "-np", "$(getconf _NPROCESSORS_ONLN)"] # doesn't work
ENV processors 4
ENTRYPOINT ["/tini", "--", "mpirun", "-np", "$processors"] # doesn't work

有人设法得到这种工作流程吗?

共有1个答案

吕皓
2023-03-14

这些可能不会奏效:参见第4783期

entrypointcmd是特殊的,因为它们不使用shell启动(因此您可以选择自己的shell),并且iirc也对它们进行了转义。

与shell表单不同,exec表单不调用命令shell。
这意味着不进行正常的shell处理。

COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]

例如,请参见vromero/activemq-artemis-docker的Dockerfile,该文件运行脚本docker-entrypoint.sh.
为了允许cmd也运行,脚本以:

exec "$@"

(它将执行后面的任何参数,或者来自cmd指令,或者来自Docker run参数)

吉利在评论中补充道:

我在DockerFile中使用:

COPY docker-entrypoint.sh
ENTRYPOINT ["/tini", "--", "/docker-entrypoint.sh"] 

在entrypoint脚本中:

#!/bin/bash
exec mpirun -np $(nproc) "$@"
 类似资料:
  • 假设我有以下Dockerfile: 命令使得在容器启动时启动。我还希望能够在容器启动时使用命令启动。但是,根据文档,Dockerfile中必须只有一个

  • 我正在从另一个设置了特定入口点的图像创建一个图像。但是,我希望我的图像有一个默认的。如何重置入口点? 我尝试了以下Dockerfile: 不幸的是,它不像默认的入口点那样工作,因为它需要引用命令。 如何在不引用的情况下使用命令?

  • 我有以下DockerFile: 这是什么意思:switch的值丢失了,我如何运行它?谢谢你的帮助 更新 请参阅此处:docker ASP.NET核心容器在mysql容器之后启动以获取更多信息。很抱歉有类似的第二个线程。请删除此线程

  • 我的Dockerfile有一个在EntryPoint上运行的脚本。容器计划用我的代码所在的卷挂载运行,一旦容器用卷挂载运行,它需要运行几个命令。 docker run-itd-v/home/user/directory:/my-mount-dir build-container 注意:startup-script.sh包含应该在挂载的目录文件上运行的命令。

  • 我试图让我的docker db容器在创建时自动用数据集填充数据库。根据mariadb留档,卷中有一个文件夹可用于此目的。 我设置了我的文件来镜像我在StackOverflow上找到的示例,但是仍然无法执行我的SQL脚本。以下是我的文件的相关部分: 在文件,我有一个文件: 在每次测试迭代之前,我会清理所有旧的/缓存的Docker内容: 我发现这实际上并没有删除数据库卷。运行仍会显示过去存在的卷 Do

  • 以下是我的项目结构的一部分: 我有init.sql脚本,它应该创建用户、数据库和表(用户和数据库与docker-compose.yml文件中的相同) 但当我查看docker entrypoint initdb.d文件夹时,它是空的(没有init.sql文件)。我使用以下命令: docker exec最新发布的\u postgres-passport\u 1 ls-l docker入口点initdb