awscli
を使用してバックアップを行うためにcronjobを必要とするDockerコンテナーをセットアップしています。
CronジョブがDockerコンテナーの環境変数にアクセスできないという問題があります。起動時に回避しながら、すべての環境変数をファイルに出力しますprintenv > /env
。
Cronジョブからsource
を使用しようとすると(crontabとcrontabによって呼び出されるスクリプトの両方で直接試しました)、機能していないようです。
私はプロジェクトの簡略版を作成して、問題を実証しました(ロギング用のrsyslog
を含む):
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:
# Every 3 minutes try to source /env and run `aws s3 ls`.
*/3 * * * * root /usr/bin/env bash & source /env & aws s3 ls >> /test 2>&1
コンテナを起動すると、/env
は私の変数を使用して作成されましたが、ソースが取得されることはありません。
まず、コマンドの(まあ、Shellビルトインの)名前はsource
です。 source
というスクリプトを作成して/
に配置しない限り、/source
ではなくsource
が必要です。
次の問題は、通常cron
が/bin/sh
として持っているものをすべて使用し、source
がバシズム(または他のより複雑なシェル)であることです。ポータブルな POSIX準拠のコマンド は、ファイルを取得するための.
です。 source
の代わりに試してください:
*/3 * * * * root /usr/bin/env bash & . /env & aws s3 ls >> /test 2>&1
また、何をしているのかよくわかりません。 bashセッションを開始してバックグラウンドに送信する意味は何ですか? bashを使用して後続のコマンドを実行する場合は、次のものが必要です。
*/3 * * * * root /usr/bin/env bash -c '. /env && aws s3 ls' >> /test 2>&1
また、&
を&&
に変更しました。バックグラウンドでのソーシングは、私が見る限りでは無意味だからです。