[英]How can I set Bash aliases for docker containers in Dockerfile?
我是Docker的新手。我發現我們可以使用Dockerfile中的ENV指令設置環境變量。但是如何在Dockerfile中為長命令設置Bash別名呢?
基本上就像你往常一樣,通過將它添加到用戶的.bashrc
:
FROM foo
RUN echo 'alias hi="echo hello"' >> ~/.bashrc
像往常一樣,這僅適用於交互式 shell:
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
對於非交互式 shell,您應該創建一個小腳本並將其放在您的路徑中,即:
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>
如果您只想在 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
辛苦了!
另一種選擇是僅使用容器外部的“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 "$@"
(快速復制/粘貼,抱歉)
vi ~/.bash_aliases
source ~/.bash_aliases
我認為最簡單的方法是將文件掛載到包含別名的容器中,然后指定 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 變量,並允許進一步的命令通過管道。
這是一個 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
@ErikDannenberg的回答起到了作用,但就我而言,需要進行一些調整。
它不適用於別名,因為顯然交互式 shell 存在問題。
我找到了他的第二個解決方案,但它仍然沒有真正奏效。 我檢查了我項目中現有的 shell 腳本,並注意到頭部注釋(第一行 = #!/usr/bin/env sh
)與#!/usr/bin/bash
有點不同。 在相應地改變它之后,它開始為我的t
和tc
“別名”工作,但我不得不使用他的第二個解決方案的附錄來讓tf
工作。
這是完整的 Dockerfile
FROM php:8.1.1-fpm-alpine AS build
RUN apk update && apk add git
RUN curl -sS https://getcomposer.org/installer | php && mv composer.phar /usr/local/bin/composer
RUN apk add --no-cache $PHPIZE_DEPS \
&& pecl install xdebug \
&& docker-php-ext-enable xdebug \
&& touch /usr/local/etc/php/conf.d/99-xdebug.ini \
&& echo "xdebug.mode=coverage" >> /usr/local/etc/php/conf.d/99-xdebug.ini \
&& echo -e '#!/usr/bin/env sh\nphp artisan test' > /usr/bin/t \
&& chmod +x /usr/bin/t \
&& echo -e '#!/usr/bin/env sh\nphp artisan test --coverage' > /usr/bin/tc \
&& chmod +x /usr/bin/tc \
&& echo -e '#!/usr/bin/env sh\nphp artisan test --filter "$@"' > /usr/bin/tf \
&& chmod +x /usr/bin/tf
WORKDIR /var/www
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.