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

时间:2019-05-15 16:00:14

标签: linux bash docker sed

我有一个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

1 个答案:

答案 0 :(得分:2)

const result = new Promise( (res, rej) => { if (condition) { res(); } else { rej(); } } 的特定建议:使用插入而不是替换

以下内容仍假定实现了与GNU sed兼容的非标准-i选项。

sed

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

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

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

通常,将确切内容传递到RUN ["sed","-i","-e","2i/bootstrap_mongo_on_k8s.sh &","/usr/local/bin/docker-entrypoint.sh"] 命令的最安全方法是使用JSON列表。

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

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/

作为JSON列表,应为:

/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"]