我在 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 中可用时才需要该标志,这就是我的情况)
它确实使它变得更加冗长,但是您始终可以创建别名或函数来包装它。