我正在使用kubernetes secret作为我的环境变量 (http://kubernetes.io/docs/user-guide/secrets/#using-secrets-as-environment-variables)。
我已经检查了
是否正确设置了env varskubectl exec -it my_pod bash
1
echo $RAILS_ENV #=> staging
2
bin/rails c;
puts ENV['RAILS_ENV'] #=> staging
它适用于我的rails应用程序和bash命令,但在执行cron进程时不起作用。
我已经阅读了一些帖子来理解cron进程(例如https://unix.stackexchange.com/questions/27289/how-can-i-run-a-cron-command-with-existing-environmental-variables)并知道我应该在执行cron命令之前使用.profile或.bashrc。
$ crontab -l
* * * * * . $HOME/.profile; /bin/bash -l -c 'echo rails_env=$RAILS_ENV >> /tmp/cron_test.log'
* * * * * . $HOME/.bashrc; /bin/bash -l -c 'echo rails_env=$RAILS_ENV >> /tmp/cron_test.log'
但两者都不适合我''
结果
rails_env=
任何帮助将不胜感激!
===
[更新:添加kubernetes yaml config]
由kubernetes config和kubernetes secret分配的两个环境变量都可以在bash和rails应用程序中读取,但在cron进程中不起作用。
deployment.yaml
spec:
containers:
- name: my_rails
...
command:
- bash
args:
- /tmp/run_cron.sh
...
env:
- name: RAILS_ENV
value: staging
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: rails-secret
key: MYSQL_PASSWORD
secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: rails-secret
type: Opaque
data:
MYSQL_PASSWORD: ENCODED_PASSWORD
答案 0 :(得分:2)
我和一些人讨论后找到了解决方案。
问题应该是docker级别而不是kubernetes级别。 https://ypereirareis.github.io/blog/2016/02/29/docker-crontab-environment-variables/
Cron进程并不像普通的login-shell那样运行,因此它不能满足我们对docker / k8s设置的读取环境变量的期望。
要解决这个问题,我们必须首先让cron进程读取环境变量。
STEP1。
在run_cron.sh
中添加一行来转储环境变量#!/bin/bash
# dump environment variables
printenv | sed 's/^\(.*\)$/export \1/g' >> /etc/profile.d/rails_env.sh
cron -f
STEP2。
在执行命令之前让cron读取环境变量。
* * * * * . /etc/profile.d/rails_env.sh; ruby my_job.rb >> /tmp/cron.log 2>&1
或使用bash - login 选项,这将是/etc/profile.d
下的每个文件* * * * * /bin/bash -l -c 'ruby my_job.rb >> /tmp/cron.log 2>&1'
然后cron按预期工作!
答案 1 :(得分:1)
您可能应该使用CronJobs,而不是在容器内运行cron脚本,您可以使用与部署相同的方式设置env变量。