首页 > 解决方案 > 如何正确转义要传递给`docker run /bin/bash --init-file`的脚本

问题描述

很接近,但使用带有卷的临时文件,我希望echo "cd..."命令在 init-script 上下文中运行(在容器内部,执行 /bin/bash 的位置)。

我觉得我需要进一步逃避一些事情来推迟执行,但我被困住了。

这更多是关于理解 bash 以及我哪里出错了,但最终目标无非是在交互式容器中启动 bash,并将用户留在选择的目录中(在会话中执行 'cd ...'通过 .profile,通过使用 init-file 附加到它 [或在此时已读取 .profile,使其无用])。

为什么这会导致在下面的结果代码中看到所有单引号?

dockerCmds="/bin/bash --init-file="$setupCmd" -c \"\$SHELL\""

docker run -it --rm \
    --user docker \
    --entrypoint "$CI_PROJECT_DIR/scripts/entrypoint.sh" \
    -e CI_PROJECT_DIR \
    -v ${PWD}:$CI_PROJECT_DIR \
    myImage \
    $dockerCmds;

# Runs, but the "cd /home/docker/src" command isn't being appended to so I'm left in bash, but .profile isn't modified

/home/docker/.profile
docker run -it --rm \
  --user docker \
  --entrypoint /home/docker/src/scripts/entrypoint.sh \
  -e CI_PROJECT_DIR \
  -v ~/myApp:/home/docker/src \
  myImage \
  /bin/bash '--init-file=<(echo' '"cd' '$CI_PROJECT_DIR">>/home/docker/.profile)' -c '"$SHELL"';

如果我引用 $dockerCmds,我会收到一个错误,让我认为我更接近于传递 init-file

以下是我可以使用临时文件执行此操作的方法(希望能进一步阐明我的意图):

tempBashRc=$(mktemp /tmp/myImage-bashrc.XXXXXXXXX)
CID=$(docker create myImage)
docker cp ${CID}:/home/docker/.bashrc $tempBashRc
docker rm ${CID}
printf "\ncd $CI_PROJECT_DIR;\n" >> $tempBashRc
dockerCmds="/bin/bash";

标签: bashdocker

解决方案


推荐阅读