Bash

awscli 看不到環境變數,只能從 cron 中看到?

  • October 14, 2017

我正在設置一個 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

引用自:https://unix.stackexchange.com/questions/398110