如何检测 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 ]
}
这在我们的案例中造成了一个无声的错误。
干杯
假设我有一个运行脚本的 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 ]
}
这在我们的案例中造成了一个无声的错误。
干杯