Alpine无法加载/etc/profile。
Alpine无法加载/etc/profile。
我试图编写一个(我认为应该是)简单的bash脚本,它将:\n
- \n
- 运行virtualenv在$1处创建一个新的环境
- 激活虚拟环境
- 做一些其他的事情(安装django,将django-admin.py添加到虚拟环境的路径等)
\n
\n
\n
\n第1步工作得很好,但是我似乎无法激活虚拟环境。对于那些不熟悉virtualenv的人来说,它会创建一个激活虚拟环境的activate
文件。从CLI中,您可以使用source
运行它\n
source $env_name/bin/activate
\n其中$env_name,显然,是安装虚拟环境的目录的名称。\n在我的脚本中,在创建虚拟环境之后,我将激活脚本的路径存储如下:\n
activate="`pwd`/$ENV_NAME/bin/activate"
\n但是当我调用source \"$activate\"
时,我得到以下结果:\n
/home/clawlor/bin/scripts/djangoenv: 20: source: not found
\n我知道$activate
包含正确的激活脚本路径,事实上,我甚至在调用source
之前测试了文件是否存在。但是source
本身似乎找不到它。我还尝试在CLI中手动运行所有步骤,结果一切正常。\n在我的研究中,我发现了这个脚本,它与我想要的类似,但也做了很多其他我不需要的事情,比如将所有的虚拟环境存储在~/.virtualenv目录中(或者$WORKON_HOME中的任何内容)。但是我觉得他创建了activate
的路径,并以基本上和我一样的方式调用了source \"$activate\"
。\n这是完整的脚本:\n
#!/bin/sh PYTHON_PATH=~/bin/python-2.6.1/bin/python if [ $# = 1 ] then ENV_NAME="$1" virtualenv -p $PYTHON_PATH --no-site-packages $ENV_NAME activate="`pwd`/$ENV_NAME/bin/activate" if [ ! -f "$activate" ] then echo "ERROR: activate not found at $activate" return 1 fi source "$activate" else echo 'Usage: djangoenv ENV_NAME' fi
\n免责声明:我的bash脚本技能非常弱。我在CLI中相当熟练,但是可能有一些极其愚蠢的原因导致这个脚本无法工作。
Alpine不加载/etc/profile的问题出现的原因是在POSIX标准中,/bin/sh命令应该使用的是"."(一个单点),而不是source命令。source命令是从csh中引入到bash中的。解决方法是将/bin/sh更改为/bin/bash。这样可以修复问题。在脚本完成后,命令行界面中的环境未被激活,但这只是一个小问题。
根据Bash手册,source是.的同义词。我在使用具有以下entrypoint的docker容器时遇到了这个问题:/bin/sh -c '/path/to/script.sh'。尽管我的脚本是一个bash脚本,但source命令无法加载exports。但是,"."命令可以正常工作!将source更改为"."对我有用,在shell中进行测试时使用source是有效的,但在Jenkins中失败了。非常感谢这个解决方法,它在shell中和尤其是在Jenkins中都起作用。