web-dev-qa-db-ja.com

Docker execがエイリアスをロードしない

/etc/bash.bashrcのDockerコンテナにbashエイリアスをロードしています。これは、コマンドラインPHPスクリプトへのショートカットとして機能します。これは、コンテナにログインした直後に誰でもそのエイリアスを使用できるため、便利です。

$ docker exec -it my-container bash

ただし、次のように、ログインせずに1回限りのコマンドでこのエイリアスを使用できるようにしたいと思います。

$ docker exec -it my-container my-alias

/etc/bash.bashrc以外の場所でエイリアスを定義するなど、さまざまなバリエーションを試しましたが、このエラーが発生し続けます。

rpcエラー:コード= 2 desc = ociランタイムエラー:execが失敗しました:exec: "my-alias":実行ファイルが$ PATHに見つかりません

私がウェブ上で見つけた他の提案は、これまでのところうまくいきませんでした。誰でも?

6

エイリアスがインタラクティブに使用されることを意図しているため、制限が原因ではありません。おそらくこれをハッキングすることができますが、最も簡単な解決策は、「エイリアス」を単純にスクリプトにして/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!
3
Pithikos

エイリアスは、可変引数を取る一般的に使用されるコマンドの一部を短縮する場合に最も役立ちます。 Ruby devコンテキストでは、次のようなエイリアスを作成している可能性があります

alias be="bundle exec"

bundle execをいつもタイプアウトしたいのは誰ですか?

本当に必要なのが、静的引数を持つ長いコマンドの短いバージョンである場合は、とにかくスクリプトを作成する必要があります。スクリプトを使用すると、スクリプトは常に利用可能になり、特定のコンテキストで特定のプロファイルを調達することに依存しません(基本的に信頼することはできません)。

よりカンマなケース(上記のような)は、エイリアスの最後に文字列引数を簡単に追加したいためにエイリアスを使用する場合です。例えば

$ be Rails server

または

$ be rake db:migrate

どちらの場合も、必要以上に入力する必要はありません。ただし、ほんの少しのバッシュで、より用途の広いソリューションで同じことを実現できます。

上記の回答のいくつかと同様に、ファイルを作成します-この例では/usr/local/bin/be。これは、PATH/usr/local/binが含まれていることを前提としています。

#!/usr/bin/env bash

bundle exec "$@"

フォローアップ(おそらくSudo

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

これは少し単純な例であり、Rubybundlerの両方のgemがインストールされている必要がありますが、変数で渡すことができる"$@"に注意してください。スクリプトへの引数の数。したがって、エイリアスのエルゴノミクスを取得できますが、常に使用可能でコンテキストに依存しないコマンドを使用します。

このアプローチは、コンテナーを操作するときに特に役立ちます。それが役に立てば幸い。

0
jamesconant

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フラグは、エイリアスがログインシェルでのみ使用できる場合にのみ必要です。これは私の場合です)

これはより冗長になりますが、これをラップするエイリアスまたは関数をいつでも作成できます。

0
Noel De Martin