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

np2*_*p20 53 unix bash alias docker dockerfile

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

Eri*_*erg 103

基本上就像你经常做的那样,将它添加到用户的.bashrc:

FROM foo
RUN echo 'alias hi="echo hello"' >> ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

像往常一样,这只适用于交互式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
Run Code Online (Sandbox Code Playgroud)

对于非交互式shell,您应该创建一个小脚本并将其放在路径中,即:

RUN echo -e '#!/bin/bash\necho hello' > /usr/bin/hi && \
    chmod +x /usr/bin/hi
Run Code Online (Sandbox Code Playgroud)

如果您的别名使用参数(即.hi Jim- > hello Jim),只需添加"$@":

RUN echo -e '#!/bin/bash\necho hello "$@"' > /usr/bin/hi && \
    chmod +x /usr/bin/hi
Run Code Online (Sandbox Code Playgroud)

  • Bash别名仅适用于交互式shell.只需创建一个小的shell脚本并放入您的路径,效果与别名相同.通过一个简单的例子更新了答案. (4认同)
  • 对于多个参数转义,您应该使用"$ @"而不是$*.请参阅https://unix.stackexchange.com/questions/248464/escape-shell-arg-from-one-script-to-another (3认同)
  • 对我来说,“-e”在非交互式 shell 中不起作用。删除它就像一个魅力。 (3认同)
  • 注意:从 /sf/answers/592721461/ 开始,您应该使用 **printf** 而不是 *echo* 以确保更一致的行为。所以 printf '#!/bin/bash\necho hello' > /usr/bin/hi chmod +x /usr/bin/hi (2认同)
  • 喜欢 shell 脚本的想法。正在寻找添加别名,但这要好得多。谢谢。 (2认同)

小智 14

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

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

  • 我不会将其称为别名..这是一个软链接/符号链接。别名的方便之处在于,您可以将参数传递给命令,例如`alias ll ='ls -lh',这对于符号链接是不可能的。 (2认同)

Son*_*que 6

如果您想仅在 Dockerfile 中使用别名,而不是在容器内使用别名,那么最短的方法是ENV声明

ENV update='apt-get update -qq'
ENV install='apt-get install -qq'

RUN $update && $install apt-utils \
    curl \
    gnupg \
    python3.6
Run Code Online (Sandbox Code Playgroud)

并按照已经描述的方式在容器中使用:

 RUN printf '#!/bin/bash \n $(which apt-get) install -qq $@' > /usr/bin/install
 RUN chmod +x /usr/bin/install
Run Code Online (Sandbox Code Playgroud)

大多数时候,我只是在构建阶段使用别名,而不是进入容器内部,因此第一个示例对于日常使用来说更快、更清晰、更简单。


Gil*_*pie 5

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

docker run \
    -it \
    --rm \
    -v ~/.bash_aliases:/tmp/.bash_aliases \
    [image] \
    /bin/bash --init-file /tmp/.bash_aliases
Run Code Online (Sandbox Code Playgroud)

使用示例:

docker run \
    -it \
    --rm \
    -v ~/.bash_aliases:/tmp/.bash_aliases \
    [image] \
    /bin/bash --init-file /tmp/.bash_aliases
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)
alias what='echo it works'
Run Code Online (Sandbox Code Playgroud)

输出:

it works
Run Code Online (Sandbox Code Playgroud)