如何检测 docker 构建中的当前脚本是否为 运行?

How to detect if the current script is running in a docker build?

假设我有一个运行脚本的 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 中,您可以尝试 运行 脚本

ADD myscript.sh .

RUN chmod +x myscript.sh

ENTRYPOINT ["myscript.sh"]

试试这个:

#!/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

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

isDockerContainer 应为

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

这在我们的案例中造成了一个无声的错误。

干杯