bash - 如何正确转义要传递给`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";
解决方案
推荐阅读
- .htaccess - 从重定向中删除参数
- c++ - c++ 上的相关文件
- php - 如果在 php 中包含,则 jQuery UI 可拖动类不起作用
- postgresql - 在 Postgres PostGIS 中正确存储统一的 XYZ 平面
- javascript - 如何在不重置分数的情况下重置刽子手游戏?
- intellij-idea - 创建intellij java ee项目
- python - 为 SQL 列名转换 python 字符串数组
- c# - StringReader 没有“退出”/中断
- python-3.x - 运行经过训练的机器学习模型时出错
- java - 如果生产代码针对较旧的 JRE,在测试代码中使用新的 JDK API 是否安全?