在构建期间向Docker添加别名

时间:2017-05-23 23:36:17

标签: bash docker build dockerfile aliases

因为我试图在容器的构建阶段编译程序,所以我在.bashrc中构建容器时包含了我的别名:

RUN cat /path/to/aliases.sh >> ~/.bashrc

当我启动容器时,所有别名都可用。这已经很好了,但不是我想要的行为。

我已经谷歌了,发现只有在使用交互式shell时才会加载.bashrc文件,而在容器的构建阶段并非如此。

我正在尝试使用以下方法强制加载别名:

RUN shopt -s expand_aliases

RUN shopt -s expand_aliases && alias

RUN /bin/bash -c "both commands listed above..."

令人惊讶的是,这并未达到预期的结果。 [/讽刺]

现在我的问题是:如何为容器的构建阶段设置别名?

此致

1 个答案:

答案 0 :(得分:2)

当docker执行每个RUN时,它会调用SHELL作为参数传递该行的其余部分。默认shell为/bin/sh。记录here

这里的问题是您需要为每个层执行设置别名,因为每个RUN都会启动一个新的shell。我没有找到一种非交互方式让bash每次都读取.bashrc文件。

所以,只是为了好玩我这样做了,而且它正在发挥作用:

<强> aliasshell.sh

#!/bin/bash

my_ls(){
  ls $@
}

$@

<强> Dockerfile

FROM ubuntu

COPY aliasshell.sh /bin/aliasshell.sh

SHELL ["/bin/aliasshell.sh"]

RUN ls -l /etc/issue
RUN my_ls -l /etc/issue

<强>输出

docker build .
Sending build context to Docker daemon 4.096 kB
Step 1/5 : FROM ubuntu
 ---> f7b3f317ec73
Step 2/5 : COPY aliasshell.sh /bin/aliasshell.sh
 ---> Using cache
 ---> ccdfc54dd0ce
Step 3/5 : SHELL /bin/aliasshell.sh
 ---> Using cache
 ---> bb17a8bf1c3c
Step 4/5 : RUN ls -l /etc/issue
 ---> Running in 15ae8f0bb93b
-rw-r--r-- 1 root root 26 Feb  7 23:55 /etc/issue
 ---> 0337da801651
Removing intermediate container 15ae8f0bb93b
Step 5/5 : RUN my_ls -l /etc/issue                   <-------
 ---> Running in 5f58e0aa4e95
-rw-r--r-- 1 root root 26 Feb  7 23:55 /etc/issue
 ---> b5060d9c5e48
Removing intermediate container 5f58e0aa4e95
Successfully built b5060d9c5e48