我是码头工人的新手。我发现我们可以使用Dockerfile中的ENV指令设置环境变量。但是如何在Dockerfile中为long命令设置bash别名?
答案 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)
vi ~/.bash_aliases
source ~/.bash_aliases
答案 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