Bash
awscli 看不到環境變數,只能從 cron 中看到?
我正在設置一個 docker 容器,它需要一個 cronjob 來使用
awscli
(通過環境變數進行身份驗證)進行備份。由於 cron 看不到我的 docker 變數,因此我將它們列印到文件中並在執行
aws
命令之前獲取它們。我已經確認變數是從 cron 設置的,但
awscli
沒有看到它們。這是一個展示該問題的最小項目。
Dockerfile:
FROM debian:jessie # Install aws and cron RUN apt-get -yqq update RUN apt-get install -yqq awscli cron rsyslog # Create cron job ADD crontab /etc/cron.d/hello-cron RUN chmod 0644 /etc/cron.d/hello-cron # Output environment variables to file # Then start cron and watch log CMD printenv > /env && cron && service rsyslog start && tail -F /var/log/*
crontab:
# Demonstrates that cron can see variables */2 * * * * root /usr/bin/env bash -c '. /env && echo $AWS_DEFAULT_REGION' >> /test1 2>&1 # Attempt to list s3 buckets knowing environment variables are set */2 * * * * root /usr/bin/env bash -c '. /env && aws s3 ls' >> /test2 2>&1
我最終回來了
Unable to locate credentials. You can configure credentials by running "aws configure"
。然而,如果我在 docker 容器中執行相同的命令,我會得到一個桶列表。這是
.env
我要傳遞給 docker 的文件。.env:
## AWS SETTINGS AWS_ACCESS_KEY_ID=(key removed) AWS_SECRET_ACCESS_KEY=(secret removed) AWS_DEFAULT_REGION=us-west-2
有沒有人知道為什麼
awscli
看不到環境變數,但只能在 cron 內部?
環境變數可以直接在裡面設置
crontab(5)
;這將避免額外的 shell 執行和源步驟的成本和復雜性。也就是說,您的hello-cron
文件將包含類似AWS_ACCESS_KEY_ID=(key removed) AWS_SECRET_ACCESS_KEY=(secret removed) AWS_DEFAULT_REGION=us-west-2 */2 * * * * root echo $AWS_DEFAULT_REGION >> /test1 2>&1 */2 * * * * root aws s3 ls >> /test2 2>&1