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

时间:2016-04-03 17:09:22

标签: bash unix docker alias dockerfile

我是码头工人的新手。我发现我们可以使用Dockerfile中的ENV指令设置环境变量。但是如何在Dockerfile中为long命令设置bash别名?

9 个答案:

答案 0 :(得分:83)

基本上就像您一样,将其添加到用户.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

答案 1 :(得分:9)

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

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

答案 2 :(得分:2)

如果只想在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

大多数时候,我只是在构建阶段使用别名,而不是在容器中使用别名,因此第一个示例对于每天的使用来说更加快捷,清晰和简单。

答案 3 :(得分: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 "$@"

(快速复制/粘贴,抱歉)

答案 4 :(得分:1)

  1. 编辑此文件〜/ .bash_aliases vi ~/.bash_aliases
  2. 获取此文件〜/ .bash_aliases source ~/.bash_aliases
  3. 进行。

答案 5 :(得分:1)

我刚刚将此添加到了我的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

答案 6 :(得分: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

答案 7 :(得分: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变量并允许其他命令通过管道后运行。

答案 8 :(得分: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