gpt4 book ai didi

linux - 使用 sed 在 Docker 中插入第二行(在 shebang 下)

转载 作者:太空宇宙 更新时间:2023-11-04 04:42:51 27 4
gpt4 key购买 nike

我有一个 sed 推荐的 Dockerfile,但是当我在本地运行它时,出现错误。 Docker 是否在做一些我不知道的事情?

我认为它正在尝试添加 .sh 文件,但无法确认

Dockerfile:

FROM mongo

...

RUN sed -i 's/#!\/bin\/bash/#!\/bin\/bash\n\/bootstrap_mongo_on_k8s.sh \&\n/' /usr/local/bin/docker-entrypoint.sh

本地结果:

$ sed -i 's/#!\/bin\/bash/#!\/bin\/bash\n\/bootstrap_mongo_on_k8s.sh \&\n/' /usr/local/bin/docker-entrypoint.sh

sed: 1: “/Users/*******/dev/fe ...“: command a expects \ followed by text

最佳答案

sed - 具体建议:使用插入,而不是替换

下面仍然假设非标准 -i 选项的实现与 GNU sed 兼容。

RUN sed -i -e '2i/bootstrap_mongo_on_k8s.sh &' /usr/local/bin/docker-entrypoint.sh

...或者,如果使用以下建议制定:

RUN ["sed","-i","-e","2i/bootstrap_mongo_on_k8s.sh &","/usr/local/bin/docker-entrypoint.sh"]
<小时/>

一般建议:安全地通过 Docker 传递命令

通常,将准确内容传递给 RUN 命令的最安全方法是以 JSON 列表的形式。

如果您想要在 Docker 中运行的原始、经过测试的 shell 命令是:

sed -i 's/#!\/bin\/bash/#!\/bin\/bash\n\/bootstrap_mongo_on_k8s.sh \&\n/' /usr/local/bin/docker-entrypoint.sh

...它组成的文字字符串是,每行一个,如下:

  • sed
  • -i
  • s/#!\/bin\/bash/#!\/bin\/bash\n\/bootstrap_mongo_on_k8s.sh\&\n/
  • /usr/local/bin/docker-entrypoint.sh

作为 JSON 列表,这将是:

["sed","-i","s/#!\\/bin\\/bash/#!\\/bin\\/bash\\n\\/bootstrap_mongo_on_k8s.sh \\&\\n/","/usr/local/bin/docker-entrypoint.sh"]

注意双反斜杠。这可以使用以下形式的命令生成:

printf '%s\n' \
sed \
-i \
's/#!\/bin\/bash/#!\/bin\/bash\n\/bootstrap_mongo_on_k8s.sh \&\n/' /usr/local/bin/docker-entrypoint.sh \
| jq -Rnc '[inputs]'

关于linux - 使用 sed 在 Docker 中插入第二行(在 shebang 下),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56153447/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com