Moby: 如何使生成器RUN使用/ bin / bash而不是/ bin / sh

创建于 2014-07-28  ·  11评论  ·  资料来源: moby/moby

我正在创建一个Dockerfile构建脚本,并想使用bash命令。 RUN默认情况下使用/ bin / sh。 有什么方法可以告诉RUN使用/ bin / bash代替吗?

arebuilder kinquestion

最有用的评论

@ORESoftware参见上面的讨论,以及https://github.com/moby/moby/pull/22489 ,其中添加了SHELL Dockerfile指令(Docker 1.12及更高版本)

  • 如果您要为单个RUN使用不同的外壳程序,请使用Exec格式(JSON)表示法-如上文所述:

    RUN ["/bin/bash", "-c", "echo I am now using bash!"]
    
  • 如果要更改映像中的默认外壳程序(以及在构建过程中),请使用在https://github.com/moby/moby/pull/22489中实现的SHELL Dockerfile指令:

    SHELL ["/bin/bash", "-c"]
    RUN echo I am now using bash!
    
  • 或以上的组合

    FROM ubuntu
    RUN echo I am using the default (/bin/sh)
    RUN ["/bin/bash", "-c", "echo I am using bash"]
    SHELL ["/bin/bash", "-c"]
    RUN echo I am using bash, which is now the default
    RUN ["/bin/sh", "-c", "echo I am using /bin/sh"]
    RUN ["echo", "I don't use a shell at all"]
    

所有11条评论

不,这硬编码为“ / bin / sh -c”
当然可以在上一个构建步骤中将/ bin / bash链接到/ bin / sh。

我最终更改了Dockerfile脚本以复制文件并使用该文件,而不是使用我在bash中一直使用的重定向。

@dwatrous您是否尝试过RUN ["echo", "hello"]不会被/bin/sh IIRC包装。 因此,如果您绝对想要bash,则可以调用它: RUN ["/bin/bash", "-c", "echo hello all in one string"]
让我们知道它是否可以解决您的问题。

bash可以在RUN说明中手动使用。

没有意图或计划将其更改为bash。

我将其标记为文档问题,因为我们可能希望对此进行记录。 这是第三次或第四次出现此问题。

公关: https :

由于以下原因,现在可以关闭它: https :

那么这是什么故事呢?

@ORESoftware参见上面的讨论,以及https://github.com/moby/moby/pull/22489 ,其中添加了SHELL Dockerfile指令(Docker 1.12及更高版本)

  • 如果您要为单个RUN使用不同的外壳程序,请使用Exec格式(JSON)表示法-如上文所述:

    RUN ["/bin/bash", "-c", "echo I am now using bash!"]
    
  • 如果要更改映像中的默认外壳程序(以及在构建过程中),请使用在https://github.com/moby/moby/pull/22489中实现的SHELL Dockerfile指令:

    SHELL ["/bin/bash", "-c"]
    RUN echo I am now using bash!
    
  • 或以上的组合

    FROM ubuntu
    RUN echo I am using the default (/bin/sh)
    RUN ["/bin/bash", "-c", "echo I am using bash"]
    SHELL ["/bin/bash", "-c"]
    RUN echo I am using bash, which is now the default
    RUN ["/bin/sh", "-c", "echo I am using /bin/sh"]
    RUN ["echo", "I don't use a shell at all"]
    

我知道我参加聚会很晚,是的,这不是最好的解决方案,但是它可以满足我的需求

下载并解压缩SDK之后,在我的docker文件中,运行以下两个命令

运行cp / bin / bash / bin / sh
RUN echo“源〜/ google-cloud-sdk / path.bash.inc” >>〜/ .bashrc
RUN源〜/ .bashrc

之后,可以在构建期间和运行时使用gcloud命令

对于那些对严格的OCI可再现性感兴趣的人,按照podman 1.4,Dockerfile调用SHELL似乎不属于OCIv1规范:

步骤2:外壳[“ / bin / bash”,“ -c”]
ERRO [0000] SHELL不支持OCI图像格式,[/ bin / bash -c]将被忽略。 必须使用docker格式

更新:看起来thaJeztah是正确的,关于在buildah上支持此功能的一些讨论: https :

Update2: BUILDAH_FORMAT=docker来解救

@qhaas认为这与OCI规范无关,仅与buildah实现有关

此页面是否有帮助?
0 / 5 - 0 等级