簡體   English   中英

如何為Dockerfile中的docker容器設置Bash別名?

[英]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 "$@"

(快速復制/粘貼,抱歉)

  1. 編輯此文件〜/ .bash_aliases vi ~/.bash_aliases
  2. 源文件〜/ .bash_aliases source ~/.bash_aliases
  3. 完成。

我認為最簡單的方法是將文件掛載到包含別名的容器中,然后指定 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有點不同。 在相應地改變它之后,它開始為我的ttc “別名”工作,但我不得不使用他的第二個解決方案的附錄來讓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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM