Docker exec 不加载别名

Docker exec 不加载别名

我在 Docker 容器中加载了一个 bash 别名/etc/bash.bashrc。它充当命令行 PHP 脚本的快捷方式。这很方便,因为任何人都可以在登录容器后直接使用该别名,如下所示:

$ docker exec -it my-container bash

不过,我还希望能够在无需登录的情况下在一次性命令中使用此别名,例如:

$ docker exec -it my-container my-alias

我尝试了不同的变化,例如在其他地方定义别名/etc/bash.bashrc,但我一直遇到这个错误:

rpc 错误:代码 = 2 desc = oci 运行时错误:exec 失败:exec:“my-alias”:在 $PATH 中未找到可执行文件

到目前为止,我在网上找到的其他建议都没有起到作用。有人知道吗?

答案1

由于别名旨在交互使用,因此无法实现。您可能可以绕过这个问题,但迄今为止最简单的解决方案是将您的“别名”制作成脚本并将其放入 中/bin

Dockerfile

RUN echo '#! /bin/sh'                >> /bin/mycommand
RUN echo 'echo "running mycommand!"' >> /bin/mycommand
RUN chmod u+x /bin/mycommand

然后它按预期工作

docker exec -it f3a34 mycommand # => running mycommand!

答案2

当你想缩短常用命令的一部分(该命令带有可变参数)时,别名非常有用。在 ruby​​ dev 上下文中,可能会创建一个别名,例如

alias be="bundle exec"

因为谁愿意bundle exec一直打字呢?

如果您真正想要的是带有静态参数的长命令的较短版本,那么您无论如何都应该创建一个脚本。使用脚本,它将始终可用,并且不依赖于在特定上下文中获取特定配置文件(您基本上永远不能依赖它)。

更常见的情况(如上文所述)是当您使用别名时,因为您想轻松地将字符串参数放在别名的末尾。例如

$ be rails server

或者

$ be rake db:migrate

在这两种情况下,我都不想输入太多不必要的内容。但是,只需使用 bash,您就可以通过更通用的解决方案实现相同的目的。

与上面的一些答案类似,/usr/local/bin/be在此示例中创建一个文件 - 假设/usr/local/bin包含在您的 中PATH

#!/usr/bin/env bash

bundle exec "$@"

随后(可能sudo

$ chmod +x /usr/local/bin/be

这是一个有点幼稚的例子,需要安装ruby和gem,但要注意的是,它允许您将可变数量的参数传入脚本。因此,您可以获得别名的人体工程学,但命令始终可用且不依赖于上下文。bundler"$@"

我发现这种方法在使用容器时特别有用。希望它能有所帮助。

答案3

如果您的容器下有一个脚本文件,只需添加这些 RUN。

RUN cat /workdir/bin/doit.sh >> /bin/doit
RUN chmod u+x /bin/doit

运行它:

docker exec -it container_name doit

doit.sh 示例

#!/usr/bin/env bash
python manage.py $@

答案4

我遇到了这个问题,我通过将想要执行的命令包装在临时 shell 中来解决它,在您的示例中,它将像这样完成:

$ docker exec -it my-container sh -l -c "my-alias"

-l仅当您的别名仅在登录 shell 中可用时才需要该标志,这就是我的情况)

它确实使它变得更加冗长,但是您始终可以创建别名或函数来包装它。

相关内容