Dockerは初めてです。DockerfileのENV命令を使用して環境変数を設定できることがわかりました。しかし、Dockerfileで長いコマンドのbashエイリアスを設定するにはどうすればよいでしょうか。
Dockerは初めてです。DockerfileのENV命令を使用して環境変数を設定できることがわかりました。しかし、Dockerfileで長いコマンドのbashエイリアスを設定するにはどうすればよいでしょうか。
回答:
基本的にあなたがいつもするように、それをユーザーのに追加することによって.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
既存のコマンドのエイリアスを作成するには、次を使用することもできますln -s
。
ln -s $(which <existing_command>) /usr/bin/<my_command>
alias ll='ls -lh'
は、シンボリックリンクでは不可能なようなパラメータをコマンドに渡すことができることです。
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
ほとんどの場合、私はビルド段階でエイリアスを使用し、コンテナ内には入りません。そのため、最初の例は、毎日の使用でより速く、より明確で、より簡単です。
これを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
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 "$@"
(クイックコピー/貼り付け、申し訳ありません)
最も簡単な方法は、エイリアスを含むファイルをコンテナーにマウントし、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
上記の解決策のいくつかを使用しましたが、エイリアスはまだ認識されていません。
エイリアスを設定して、後の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
命令は新しいシェルで実行されるため、この例では、エイリアスを使用しようとしたときにエイリアスファイルが読み込まれなくなりました。
これは、インタラクティブに使用するすべてのコンテナーにエイリアスを含めるための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