Я создаю сценарий сборки Dockerfile и хочу использовать команды bash. RUN по умолчанию использует / bin / sh. Есть ли способ указать RUN использовать вместо этого / bin / bash?
Нет, это жестко запрограммировано в "/ bin / sh -c"
Конечно, можно было связать / bin / bash с / bin / sh на предыдущем этапе сборки.
Я закончил тем, что изменил свой сценарий Dockerfile, чтобы скопировать файл и использовать его, вместо того, чтобы использовать перенаправление, которое я использовал в bash.
@dwatrous вы пробовали RUN ["echo", "hello"]
не будет обернут /bin/sh
IIRC. Так что, если вам абсолютно нужен bash, вы можете вызвать его: RUN ["/bin/bash", "-c", "echo hello all in one string"]
.
Сообщите нам, если это решит вашу проблему.
bash можно использовать вручную, используя его в инструкциях RUN
.
Нет никакого намерения или плана сделать возможным изменение его на bash.
Я отмечу это как проблему с документом, потому что мы могли бы захотеть это задокументировать. Этот вопрос возникает уже в третий или четвертый раз.
Теперь это можно закрыть по следующей причине: https://github.com/docker/docker/pull/7489
так что за история по этому поводу?
@ORESoftware См. Обсуждение выше и https://github.com/moby/moby/pull/22489 , где добавлена инструкция SHELL
Dockerfile (Docker 1.12 и выше).
Если вы хотите использовать другую оболочку для одного RUN
, используйте нотацию Exec form (JSON), как описано выше:
RUN ["/bin/bash", "-c", "echo I am now using bash!"]
Если вы хотите изменить оболочку по умолчанию в своем образе (и во время сборки), используйте инструкцию SHELL
Dockerfile, которая была реализована в https://github.com/moby/moby/pull/22489 :
SHELL ["/bin/bash", "-c"]
RUN echo I am now using bash!
Или сочетание вышеперечисленного
FROM ubuntu
RUN echo I am using the default (/bin/sh)
RUN ["/bin/bash", "-c", "echo I am using bash"]
SHELL ["/bin/bash", "-c"]
RUN echo I am using bash, which is now the default
RUN ["/bin/sh", "-c", "echo I am using /bin/sh"]
RUN ["echo", "I don't use a shell at all"]
Я знаю, что опаздываю на вечеринку, и да, это не лучшее решение, но оно сработало для того, что мне было нужно
В моем файле докеров после загрузки и извлечения SDK я запускаю эти две команды
ЗАПУСК cp / bin / bash / bin / sh
RUN echo "source ~ / google-cloud-sdk / path.bash.inc" >> ~ / .bashrc
Источник RUN ~ / .bashrc
После этого команда gcloud доступна во время сборки и во время выполнения.
Для тех, кто заинтересован в строгой воспроизводимости OCI, вызов Dockerfile SHELL
, по-видимому, не входит в спецификацию OCIv1, согласно podman 1.4:
ШАГ 2: ОБОЛОЧКА ["/ bin / bash", "-c"]
ERRO [0000] SHELL не поддерживается для формата изображения OCI, [/ bin / bash -c] будет проигнорировано. Необходимо использовать форматdocker
Обновление: похоже, что thaJeztah прав, некоторые обсуждения поддержки этой функции на buildah: https://github.com/containers/buildah/issues/507
Update2: BUILDAH_FORMAT=docker
на помощь
@qhaas не думает, что это связано со спецификациями OCI, это просто реализация buildah
Самый полезный комментарий
@ORESoftware См. Обсуждение выше и https://github.com/moby/moby/pull/22489 , где добавлена инструкция
SHELL
Dockerfile (Docker 1.12 и выше).Если вы хотите использовать другую оболочку для одного
RUN
, используйте нотацию Exec form (JSON), как описано выше:Если вы хотите изменить оболочку по умолчанию в своем образе (и во время сборки), используйте инструкцию
SHELL
Dockerfile, которая была реализована в https://github.com/moby/moby/pull/22489 :Или сочетание вышеперечисленного