如何在 Dockerfile 中为 docker 容器设置 Bash 别名?

How can I set Bash aliases for docker containers in Dockerfile?

我是 Docker 的新手。我发现我们可以使用 Docker 文件中的 ENV 指令来设置环境变量。但是如何在 Docker 文件中为长命令设置 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

您可以使用 ENTRYPOINT,但它不适用于您的 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 "$@"

要创建现有命令的别名,也可以使用 ln -s:

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

如果你只想在 Dockerfile 中使用别名,而不是在容器中使用,那么最短的方法是 ENV declaration:

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 文件中:

# Set up 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

我认为最简单的方法是将包含别名的文件装载到容器中,然后指定 Bash 应该在哪里找到它:

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

示例用法:

echo 'alias what="echo it works"' > my_aliases
docker run -it --rm -v ~/my_aliases:/tmp/my_aliases ubuntu:18.04 /bin/bash --init-file /tmp/my_aliases
alias

输出:

alias what='echo it works'
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 源,设置更多的环境变量,并允许进一步的命令通过管道.

这是一个 Bash 函数,可以在您交互使用的每个容器中使用别名。

ducker_it() {
    docker cp ~/bin/alias.sh "":/tmp
    docker exec -it "" /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 "" /bin/bash
}

之前需要的步骤:

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

@ErikDannenberg的回答起到了作用,但就我而言,需要进行一些调整。

它不适用于别名,因为显然交互式 shells 存在问题。

我找到了他的第二个解决方案,但仍然没有真正奏效。我检查了我项目中现有的 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