DockerfileでDockerコンテナのbashエイリアスを設定するにはどうすればよいですか?


87

Dockerは初めてです。DockerfileのENV命令を使用して環境変数を設定できることがわかりました。しかし、Dockerfileで長いコマンドのbashエイリアスを設定するにはどうすればよいでしょうか。


エイリアスは、非常に長い間、本質的に非推奨と見なされてきました。関数を使用します。する必要はもうありません今までにエイリアスを使用は。80年代後半からのこれらのアプローチがこれほど長く続くのはどうしてですか?
William Pursell 2018

19
もちろん、便利でシンプルだからです。
アーサー

13
@WilliamPursellでは、代わりに関数の使用方法を説明する必要があるかもしれません。
Eric Dela Cruz

2
エイリアスはシンプルで便利、壊れやすく、エラーが発生しやすいものです。関数は同じように使いやすいですが、より多くの柔軟性と堅牢性を提供します。それらの使用方法については、利用可能なリソースがたくさんあります。
William Pursell 2018

回答:


144

基本的にあなたがいつもするように、それをユーザーのに追加することによって.bashrc

FROM foo
RUN echo 'alias hi="echo hello"' >> ~/.bashrc

いつものように、これはインタラクティブシェルでのみ機能します。

docker build -t test .
docker run -it --rm --entrypoint /bin/bash test hi
/bin/bash: hi: No such file or directory
docker run -it --rm test bash
$ hi
hello

非対話型シェルの場合は、小さなスクリプトを作成してパスに配置する必要があります。

RUN echo -e '#!/bin/bash\necho hello' > /usr/bin/hi && \
    chmod +x /usr/bin/hi

エイリアスがパラメータを使用している場合(つまりhi Jim-> hello Jim)、次を追加するだけ"$@"です:

RUN echo -e '#!/bin/bash\necho hello "$@"' > /usr/bin/hi && \
    chmod +x /usr/bin/hi

これに感謝します。非インタラクティブシェルの例を提供できますか?これを解決するためのENTRYPOINTとCMDを探していました
c24b 2016

5
Bashエイリアスはインタラクティブシェルでのみ機能します。小さなシェルスクリプトを作成してパスに入力するだけで、エイリアスと同じ効果が得られます。簡単な例で答えを更新しました。
Erik Dannenberg 2016

1
注:stackoverflow.com/a/8467449から、より一貫した動作を保証するために、エコーの代わりにprintfを使用する必要があります。したがって、printf '#!/ bin / bash \ neocho hello'> / usr / bin / hi chmod + x / usr / bin / hi
barraq 2017

2
シェルスクリプトのアイデアが大好きです。エイリアスを追加しようとしていましたが、これははるかに優れています。ありがとう。
ブリズ2018年

3
複数の引数をエスケープするには、$ *の代わりに「$ @」を使用する必要があります。unix.stackexchange.com/questions/248464/…を
gnou

14

既存のコマンドのエイリアスを作成するには、次を使用することもできますln -s

ln -s $(which <existing_command>) /usr/bin/<my_command>


7
私はこれをエイリアスとは呼びません..それはソフトリンク/シンボリックリンクです。エイリアスの便利な点alias ll='ls -lh'は、シンボリックリンクでは不可能なようなパラメータをコマンドに渡すことができることです。
QWERTZ

3

Dockerfileだけでエイリアスを使用し、コンテナー内では使用しない場合、最短の方法はENV宣言です。

ENV update='apt-get update -qq'
ENV install='apt-get install -qq'

RUN $update && $install apt-utils \
    curl \
    gnupg \
    python3.6

そして、すでに説明したような方法でコンテナで使用するために:

 RUN printf '#!/bin/bash \n $(which apt-get) install -qq $@' > /usr/bin/install
 RUN chmod +x /usr/bin/install

ほとんどの場合、私はビルド段階でエイリアスを使用し、コンテナ内には入りません。そのため、最初の例は、毎日の使用でより速く、より明確で、より簡単です。


2

これをapp.dockerfileに追加しました

# setup aliases
ADD ./bashrc_alias.sh /usr/sbin/bashrc_alias.sh
ADD ./initbash_profile.sh /usr/sbin/initbash_profile
RUN chmod +x /usr/sbin/initbash_profile
RUN /bin/bash -C "/usr/sbin/initbash_profile"

そして、その中にはinitbash_profile.shカスタムエイリアスを追加するだけで、.bashrcファイルを入手する必要はありません。

# add the bash aliases
cat /usr/sbin/bashrc_alias.sh >> ~/.bashrc

御馳走を働いた!

もう1つのオプションは、コンテナーの外部から「docker exec -itコマンド」を使用し、独自の.bashrcまたは.bash_profile(好きなもの)を使用することです。

例えば。 docker exec -it docker_app_1 bash


1

Dockerfileでエントリポイントを使用することはできますが、エイリアスでは機能しません。

ADD dev/entrypoint.sh /opt/entrypoint.sh
ENTRYPOINT ["/opt/entrypoint.sh"]

君の entrypoint.sh

#!/bin/bash
set -e

function dev_run()
{

}

export -f dev_run

exec "$@"

(クイックコピー/貼り付け、申し訳ありません)


一部のDockerイメージがすでにデフォルトのエントリポイント(phusionベースイメージなど)をオーバーライドしている可能性があることに注意してください。
トーマスデコー2016

1

最も簡単な方法は、エイリアスを含むファイルをコンテナーにマウントし、bashがそれを見つける場所を指定することだと思います。

docker run \
    -it \
    --rm \
    -v ~/.bash_aliases:/tmp/.bash_aliases \
    [image] \
    /bin/bash --init-file /tmp/.bash_aliases

使用例:

user@cobalt:~$ echo 'alias what="echo it works"' > my_aliases
user@cobalt:~$ docker run -it --rm -v ~/my_aliases:/tmp/my_aliases ubuntu:18.04 /bin/bash --init-file /tmp/my_aliases
root@565e4a1bdcc0:/# alias
alias what='echo it works'
root@565e4a1bdcc0:/# what
it works

0

上記の解決策のいくつかを使用しましたが、エイリアスはまだ認識されていません。

エイリアスを設定して、後のDockerfileステップ内と実行時のコンテナーの両方で使用しようとしています。

RUN echo "alias model-downloader='python3 ${MODEL_DL_PATH}/downloader.py'" >> ~/.bash_aliases && \
    echo "alias model-converter='python3 ${MODEL_DL_PATH}/converter.py'" >> ~/.bash_aliases && \
    source ~/.bash_aliases

# Download the model
RUN model-downloader --name $MODEL_NAME -o $MODEL_DIR --precisions $MODEL_PRECISION;

私にとっての解決策は、フォルダーパスを保持するENV変数を使用してから、正確な実行可能ファイルを追加することでした。ARGを使用することもできましたが、シナリオの多くでは、ビルド段階とランタイムの後半の両方でエイリアスが必要でした。

ENV変数をbashスクリプトと組み合わせて使用​​しました。このスクリプトは、依存関係が発生すると実行され、bashソースを設定し、さらにいくつかのenv変数を設定し、さらにコマンドをパイプスルーできるようにします。


すべてのRUN命令は新しいシェルで実行されるため、この例では、エイリアスを使用しようとしたときにエイリアスファイルが読み込まれなくなりました。
ErikDannenberg20年

100%@ ErikDannenbergコメントに感謝し、またこれに更新を投稿する必要があることを私に思い出させてくれました-私は解決策を発見しました、そしてそれはあなたが提案したのと非常によく似ています。
alanionita

0

これは、インタラクティブに使用するすべてのコンテナーにエイリアスを含めるためのBash関数です。

ducker_it() {
    docker cp ~/bin/alias.sh "$1":/tmp
    docker exec -it "$1" /bin/bash -c "[[ ! -f /tmp/alias.sh.done ]] \
        && [[ -w /root/.bashrc ]] \
        && cat /tmp/alias.sh >> /root/.bashrc \
        && touch /tmp/alias.sh.done"
    docker exec -it "$1" /bin/bash
}

前に必要な手順:

grep ^alias ~/.zshrc > ~/bin/alias.sh

-1
  1. このファイルを編集する〜/ .bash_aliases vi ~/.bash_aliases
  2. このファイルのソース〜/ .bash_aliases source ~/.bash_aliases
  3. 完了しました。

これは、Dockerコンテナーを起動するたびに問題ありませんが、エイリアスは次回は残りません。このソリューションが問題ないたびにそれらを再度追加してもかまわない場合。
mikoop

これは答えではなく、質問をしている人をあざけることです。
bhuvin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.