3

У меня есть псевдоним bash, загруженный в контейнер Docker, в /etc/bash.bashrc . Он работает как ярлык для командной строки PHP-скрипта. Это удобно, поскольку любой может использовать этот псевдоним сразу после входа в контейнер, используя:

$ docker exec -it my-container bash

Однако я также хотел бы иметь возможность использовать этот псевдоним в одноразовых командах без входа в систему, например:

$ docker exec -it my-container my-alias

Я пробовал разные варианты, такие как определение псевдонима в других местах, чем /etc/bash.bashrc , но я продолжаю сталкиваться с этой ошибкой:

ошибка rpc: code = 2 desc = oci ошибка времени выполнения: ошибка exec: exec: "my-alias": исполняемый файл не найден в $ PATH

Другие предложения, которые я нахожу в Интернете, пока не помогли. Кто-нибудь?

4 ответа4

2

Это не связано с ограничениями из-за псевдонимов, предназначенных для интерактивного использования. Вы, вероятно, можете обойти это, но самое простое решение - просто превратить ваш "псевдоним" в скрипт и поместить его в /bin .

Dockerfile

RUN echo '#! /bin/sh'                >> /bin/mycommand
RUN echo 'echo "running mycommand!"' >> /bin/mycommand
RUN chmod u+x /bin/mycommand

Тогда все работает как положено

docker exec -it f3a34 mycommand # => running mycommand!
0

Псевдонимы в основном полезны, когда вы хотите сократить часть часто используемой команды, которая принимает переменные аргументы. В контексте ruby dev, который может создавать псевдоним, такой как

alias be="bundle exec"

потому что кто хочет все время печатать bundle exec ?

Если вам действительно нужна более короткая версия более длинной команды со статическими аргументами, то вы все равно должны создать скрипт. С помощью скрипта он всегда будет доступен и не будет зависеть от выбора конкретных профилей в определенных контекстах (на которые вы в принципе никогда не можете положиться).

Более распространенный случай (как вышеописанный) - это когда вы используете псевдоним, потому что вы хотите, чтобы строковые аргументы были легкими до конца псевдонима. Например

$ be rails server

или же

$ be rake db:migrate

В обоих случаях я не хочу печатать больше, чем нужно. Однако с помощью всего лишь нескольких шагов вы можете добиться того же в более универсальном решении.

Подобно некоторым из приведенных выше ответов, создайте файл - /usr/local/bin/be в этом примере. Это предполагает, что /usr/local/bin включен в ваш PATH .

#!/usr/bin/env bash

bundle exec "$@"

с последующим (возможно, с sudo)

$ chmod +x /usr/local/bin/be

Это немного наивный пример, и он требует, чтобы были установлены как ruby и гем bundler , но следует обратить внимание на "$@" который позволяет передавать переменное число аргументов в скрипт. Таким образом, вы получаете эргономику псевдонима, но с помощью команды, которая всегда доступна и не зависит от контекста.

Я считаю этот подход особенно полезным при работе с контейнерами. Надеюсь, поможет.

0

В конечном итоге мне понадобился немного другой подход, потому что мне не удалось заставить его работать со стратегией bash.bashrc . @joat прав, псевдоним, вероятно, неудачная комбинация с частичным выполнением командной строки (с помощью docker exec).

В конце я вставил скрипт (в моем случае через PHP Composer) в изображение. В моем случае, путем монтирования моего локального каталога, хотя это не должно иметь значения. Затем я добавляю путь к этому сценарию в моем Dockerfile через переменную окружения:

ENV PATH $PATH:./vendor/bin

Это делает скрипт глобально доступным во время выполнения.

Тем не менее, я считаю, что это обходной путь, поэтому мне интересно услышать от любого, кто на самом деле получил регулярные псевдонимы для работы во время выполнения docker exec .

0

У меня была эта проблема, и я решил ее, обернув команду, которую я хотел выполнить, во временную оболочку, в вашем примере это будет сделано так:

$ docker exec -it my-container sh -l -c "my-alias"

(флаг -l необходим только в том случае, если ваши псевдонимы доступны только в оболочках входа в систему, что в моем случае)

Это делает его более многословным, но вы всегда можете создать псевдоним или функцию, чтобы обернуть это.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .