Использование sed для вставки 2-й строки (под шебангом) в Docker - PullRequest
0 голосов
/ 15 мая 2019

У меня есть Dockerfile, который sed рекомендует, но когда я запускаю его локально, я получаю ошибку. 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 Ответ

2 голосов
/ 15 мая 2019

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, имеет следующий вид:

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]'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...