像许多 bash 问题一样,我 100% 确定有答案,但用谷歌搜索它们是具有挑战性的。
我试图理解以下内容脚本:
#!/bin/bash
# available options
export OPX_GIT_TAG="${OPX_GIT_TAG:-no}"
# package distribution
export OPX_RELEASE="${OPX_RELEASE:-unstable}"
# currently tracked release
export DIST="${DIST:-stretch}"
export ARCH="${ARCH:-amd64}"
export CUSTOM_SOURCES="${CUSTOM_SOURCES:-}"
# docker image name
IMAGE="opxhub/build"
# docker image tag
VERSION="${VERSION:-latest}"
interactive="-i"
if [ -t 1 ]; then
# STDOUT is attached to TTY
interactive="-it"
fi
read -d '' opx_docker_command <<- EOF
docker run
--rm
--name ${USER}_$(basename $PWD)_$$
--privileged
-e LOCAL_UID=$(id -u ${USER})
-e LOCAL_GID=$(id -g ${USER})
-v ${PWD}:/mnt
-v $HOME/.gitconfig:/home/opx/.gitconfig
-v /etc/localtime:/etc/localtime:ro
-e ARCH
-e DIST
-e OPX_RELEASE
-e OPX_GIT_TAG
-e CUSTOM_SOURCES
${interactive}
${IMAGE}:${VERSION}
EOF
if [[ $# -gt 0 ]]; then
# run command directly
# not using bash because tar fails to complete
# root cause unknown (see opx_rel_pkgasm.py:tar_in)
$opx_docker_command sh -l -c "$*"
else
# launch interactive shell
# using bash here because tar does not fail in an interactive shell
$opx_docker_command bash -l
fi
我对他们如何生成命令感到困惑- 特别是关于、、等的docker-run
部分。那些不应该用 括起来吗?如果不是,这些变量是如何传递的?ARCH
DIST
OPX_RELEASE
${}
答案1
如果你仔细观察,你会发现这些变量的使用是在命令-e
的一个选项中docker-run
。该选项用于使环境变量可供容器使用。
所以在这里,脚本指定姓名应传递给容器的环境变量的值,而不是值本身(正如您正确指出的那样,它需要取消引用,如$ARCH
或中所示${ARCH}
)。
你可以看看码头工人文档供进一步阅读。