因为我试图在容器的构建阶段编译程序,所以我在.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..."
令人惊讶的是,这并未达到预期的结果。 [/讽刺]
现在我的问题是:如何为容器的构建阶段设置别名?
此致
答案 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