私は次のファイルを持っていますexecute-backup-from-container.sh
。このファイルの内容は次のとおりです。
#!/bin/bash
FILE=minime.sql.`date +"%Y%m%d".gz`
CONTAINER='mysql_01'
SCRIPT_ON_CONTAINER='/container-mysql-dump.sh'
${OUTPUT}=$(docker exec ${CONTAINER} /$SCRIPT_ON_CONTAINER)
echo "=============="
echo "$CONTAINER:/$FILE"
echo "=============="
docker cp "$CONTAINER:/$FILE" backup-data/
実行するとcrontab -e
私は以下を入れています:0 5 * * 1 /home/me/projects/execute-backup-from-container.sh
これは、execute-backup-from-container.sh
は毎日午前5時に実行する必要があります。
問題は、スクリプトがまったく実行されないことです。
では、一体何が問題なのでしょうか。なぜ実行されないのですか?
エントリに対応するcronフィールドは次のことを意味します。
minute: 0
hour: 5
day of month: *
month: *
day of week: 1
command: /home/me/projects/execute-backup-from-container.sh
これは、英語で次のように変換されます。
実行したい場合:
毎日午前5時
次に、その5番目のフィールドを*
にしたいとします。
0 5 * * * /home/me/projects/execute-backup-from-container.sh
ファイルが実行可能に設定されていることを確認しましたか?スクリプトを実行可能ファイルとしてマークする例を次に示します。
$ ls -l test.sh
-rw-r--r-- 1 ahill ahill 0 Mar 23 19:30 test.sh
$ chmod +x test.sh
$ ls -l test.sh
-rwxr-xr-x 1 ahill ahill 0 Mar 23 19:30 test.sh
次に確認するのは環境です。 cronジョブは、デフォルトでは環境を継承しません。 「修正」については、ここで説明します。
既存の環境変数を使用してcronコマンドを実行するにはどうすればよいですか?
環境が重要な理由の1つは、cronがbashさえ見つけられない可能性があることです。参照: https://www.digitalocean.com/community/questions/why-is-cron-not-running-my-sh-script
それでもわからない場合は、テストを行います。cronジョブを次のように変更します。
0 5 * * * /home/me/projects/execute-backup-from-container.sh
に:
0 5 * * * /home/me/projects/execute-backup-from-container.sh >> ~/script_errors.log 2>&1
何が起こるか:次にcronがジョブを起動したときに、生成されたエラーメッセージがテキストファイルscript_errors.logにダンプされます。 (script_errors.logファイルへのパスを適切と思われるものに変更しますが、ファイルが存在する必要はありませんが、パスが存在することを確認してください。)
また、OPで本当の問題になっている可能性のある何かに気づきました。「コンテナー」という言葉です。スクリプトがDockerコンテナ内にある場合、これが解決策である可能性があります。
https://www.ekito.fr/people/run-a-cron-job-with-docker/
すべての答えを考慮した後、最後の問題は最後の行にありました:
docker cp "$CONTAINER:/$FILE" backup-data/
最後の行は
docker cp "$CONTAINER:/$FILE" docker-projects/mysql/backup-data/
皆様のご支援、誠にありがとうございます。