Docker execはエイリアスをロードしません


4

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

$ docker exec -it my-container bash

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

$ docker exec -it my-container my-alias

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

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

私がウェブ上で見つけた他の提案は、これまでのところトリックをしませんでした。誰でも?


コンテナ内にスクリプトを作成し、フルパス名でスクリプトを呼び出しますか?
bgStack15

それは回避策のための間違いなく素晴らしいアイデアです、ありがとう!しかし、なぜこのコンテキストではエイリアス自体がピックアップされないのか疑問に思います。/etc/bash.bashrcログインベースのfiではなくにあるので、そうすべきだと思いました.profile
デビッドSpreekmeester 16

my-aliasを環境変数としてエクスポートしてから、次を使用してみましたか?docker exec -it my-container $ my-alias
joat

あなたが試みていたものはいくらか制限されていました。Bashエイリアスを使用すると、コマンドライン全体のエイリアスを宣言できます。コマンドラインの一部にエイリアスを作成すると、機能する場合と機能しない場合があります(機能しない)。my-aliasをbashセッションの環境変数としてエクスポートする方が適切な方法かもしれません。
joat

回答:


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

bash.bashrc戦略をうまく機能させることができなかったため、最終的には少し異なるアプローチを取りました。@joatは正しいです。エイリアスはおそらく、コマンドラインの部分的な実行(とdocker exec)の不幸な組み合わせです。

最後に、スクリプトに(私の場合はPHP Composerを使用して)イメージに挿入しました。私の場合、ローカルディレクトリをマウントしますが、それは問題ではありません。次にDockerfile、環境変数を使用して、このスクリプトへのパスを追加します。

ENV PATH $PATH:./vendor/bin

これにより、スクリプトが実行時にグローバルに利用可能になります。

私はまだ回避策と考えていますが、docker exec実行時に動作するように実際に通常のエイリアスを取得した人から話を聞くことに興味があります。


1
回避策について具体的に詳しく説明してください。私はあなたの答えを5回読みましたが、まだ回避策が何なのかわかりません。
ラムハウンド16

@ラムハウンド:それについてすみません、あなたは正しいです。少し掘り下げてみたところ、私の最終的な解決策は実際にはわずかに異なることがわかりました。今すぐ答えを更新します。
デビッドSpreekmeester 16

0

私はこの問題を抱えていたので、一時シェル内で実行したいコマンドをラップすることで解決しました。あなたが持っている例では、次のようになります:

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

-lフラグは、エイリアスがログインシェルでのみ使用可能な場合にのみ必要です。これは私の場合です)

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


0

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

alias be="bundle exec"

誰がbundle execいつもタイプしたいの?

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

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

$ be rails server

または

$ be rake db:migrate

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

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

#!/usr/bin/env bash

bundle exec "$@"

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

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

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

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


$@(および他のシェル変数)は常に引用符で囲む必要がありますbundle exec "$@"
スコット

それを指摘してくれてありがとう。私はそれをするのが良い習慣なので先に進んで更新しましたが、この場合、厳密に必要というわけではありません。
ジェームスコナント
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.