【问题标题】:How to detect if the current script is running in a docker build?如何检测当前脚本是否在 docker build 中运行?
【发布时间】:2021-12-19 22:02:16
【问题描述】:

假设我有一个运行脚本的Dockerfile

RUN ./myscript.sh

我如何编写myscript.sh 以便它可以检测自己是否在docker build 期间由RUN 命令启动?

#! /bin/bash

# myscript.sh

if <What should I do here?>
then
  echo "I am in a docker build"
else
  echo "I am not in a docker build"
fi

理想情况下,它不应该要求对Dockerfile 进行任何更改,因此myscript.sh 的调用者不需要有关myscript.sh 的专业知识。

【问题讨论】:

  • 可能在调用脚本可以检测到的脚本之前添加特定的资源,或者使用参数调用脚本。否则我不确定这很容易
  • 如果您确定自己处于映像构建中,您会采取哪些不同的做法?为什么不能更改 Dockerfile?
  • 例如,您正在维护一个可用于docker build 或物理机的安装脚本,并且您希望在安装脚本中包含一些特定于 docker 的优化。

标签: linux bash docker shell dockerfile


【解决方案1】:

在你的 Dockerfile 中,你可以试试这个来运行脚本

ADD myscript.sh .

RUN chmod +x myscript.sh

ENTRYPOINT ["myscript.sh"]

【讨论】:

    【解决方案2】:

    试试这个:

    #!/bin/bash
    
    # myscript.sh
    
    isDocker(){
        local cgroup=/proc/1/cgroup
        test -f $cgroup && [[ "$(<$cgroup)" = *:cpuset:/docker/* ]]
    }
    
    isDockerBuildkit(){
        local cgroup=/proc/1/cgroup
        test -f $cgroup && [[ "$(<$cgroup)" = *:cpuset:/docker/buildkit/* ]]
    }
    
    isDockerContainer(){
        [ -e /.dockerenv ]
    }
    
    if isDockerBuildkit || (isDocker && ! isDockerContainer)
    then
      echo "I am in a docker build"
    else
      echo "I am not in a docker build"
    fi
    

    【讨论】:

    • 这和How to determine if a process runs inside lxc/Docker?差不多;但是如果你 docker run --rm the-image ./myscript.sh 作为构建外部的主容器命令,它不会也返回 true 吗?
    • @DavidMaze 你是对的。我想 OP 想区分 docker buildnon-docker build
    • 在执行cat /proc/1/cgroup 时,docker build 和 Docker 容器之间似乎存在差异。 /proc/1/cgroupdocker build 中包含类似 /docker/buildkit/xxxxxxxxx 的内容。 Docker 容器中不存在buildkit 字符串。
    • @YangBo 对我来说, /proc/1/cgroup 在这两种情况下都是一样的。 /.dockerenv 也存在于构建阶段。我测试了debian图像。你用的是哪张图片?
    • 看来DOCKER_BUILDKIT=1DOCKER_BUILDKIT=0影响cgroup docs.docker.com/develop/develop-images/build_enhancements
    【解决方案3】:

    只是为了插话,我似乎无法对已接受的答案发表评论(也无法编辑,因为编辑是两个字符长......对于 SO 来说还不够),但它包含一个错字。

    isDockerContainer 应该是这样的

    isDockerContainer(){
        [ -e /.dockerenv ]
    }
    

    这在我们的案例中创建了一个静默错误。

    干杯

    【讨论】:

    猜你喜欢
    • 2015-01-04
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 2021-09-22
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    相关资源
    最近更新 更多