如何为 Dockerfile 的码头集装箱设置 Bash 别名?

我是新来的。我发现我们可以使用 Dockerfile 中的 ENV指令来设置环境变量。但是如何在 Dockerfile 为长命令设置 Bash 别名呢?

113929 次浏览

基本上就像你一直做的那样,把它添加到用户的 .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

您可以在 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 "$@"

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

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

If you want to use aliases just in Dockerfile, but not inside a container then the shortest way is the 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

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

我刚把这个添加到我的 Dockerfile文件:

# Set up 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文件中,只是附加了我的自定义别名,不需要源代码的 译自: 美国《科学》杂志网站(http://en.wikipedia.org/wiki/Bash _ (Unix _ shell))原文地址: http://en.wikipedia.org/wiki/Bash _ (Unix _ shell)原文地址: http://en.wikipedia.org/wiki/Bash _ (Unix _ shell)原文地址: http://en.wikipedia.org/wiki/Bash _文件:

# Add the Bash aliases
cat /usr/sbin/bashrc_alias.sh >> ~/.bashrc

成功了!

另一种选择是从容器外部使用“ docker exec-it < Container-name > 命令”,只使用您自己的 。 bashrc. bash _ profile文件(随您喜欢)。

例如:

docker exec -it docker_app_1 bash

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

docker run \
-it \
--rm \
-v ~/.bash_aliases:/tmp/.bash_aliases \
[image] \
/bin/bash --init-file /tmp/.bash_aliases

使用方法:

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

产出:

alias what='echo it works'
what

产出:

it works

使用了以前的一些解决方案,但是仍然无法识别别名。

我试图设置别名,并在后面的 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 变量,并允许进一步的命令通过管道传输。

这里有一个 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