質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.04%

ローカルで作成したdockerコンテナ内で動いていたcronがリモート(EC2)の中で何故か動作しません。。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 440

Daimian

score 48

前提・実現したいこと

dockerコンテナ内でcronを実行し、スクリプトの実行結果をログ内に出力したいです。

発生している問題

MacOS(ローカル)の中で下記のdocker-compose.ymlをbuildし、up -dしてからコンテナ内に入ると、特に問題なくcronが起動し、/var/log/cron.logに結果が出ます。

インスタンスタイプt2.mediumのEC2インスタンス(リモート)の中に全く同じディレクトリを転送し、上述の通りbuildしてup -dするとcronは起動しているのですが、/var/log/cron.logに結果が出てきません。

アドバイスでも、ヒントでも何でも構いません!お願いします。

該当のソースコード

docker-compose.yml

version: '3'

services:
  web:
    build:
      context: ./
      dockerfile: Dockerfile_API
    tty: true
    stdin_open: true
    container_name: kaminari_API
    environment:
      RAILS_ENV: development
    volumes:
      - ./kaminari_API/kaminari_API_cron/api_cron:/etc/cron.d/api_cron
      - ./kaminari_API/kaminari_API_rails:/app/kaminari_API/kaminari_API_rails:rw
      - ./start_api.sh:/usr/local/bin/start_api.sh:ro
    ports:
      - 3000:3000
    working_dir: /app/kaminari_API/kaminari_API_rails
    command: bash /usr/local/bin/start_api.sh

  db:
    image: mariadb:latest
    container_name: kaminari_db
    ports:
      - 3307:3306
    environment:
      MYSQL_DATABASE: kaminari_API_rails_development

Dockerfile_API

FROM ruby:2.3.1

RUN apt-get update
RUN apt-get install -y nodejs
RUN apt-get install -y vim
RUN apt-get install -y mysql-client
RUN apt-get install -y cron

start_api.sh

#!/bin/sh

# cron
chmod 0644 /etc/cron.d/api_cron
chmod +x /app/kaminari_API/kaminari_API_rails/lib/tasks/dl_and_save_lightning.sh
cron && touch /etc/cron.d/api_cron

#pid
if [[ -f ./tmp/pids/server.pid ]]
then
  rm ./tmp/pids/server.pid
fi

bundle install
bundle exec rails s -b 0.0.0.0

kaminari_API/kaminari_API_cron/api_cron

PATH=/usr/local/bundle/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/app/kaminari_API/kaminari_API_rails
BUNDLE_BIN=/usr/local/bundle/bin
RAILS_ENV=development
BUNDLE_PATH=/usr/local/bundle
RUBYLIB=/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.13.6/lib

*/2 * * * * root /app/kaminari_API/kaminari_API_rails/lib/tasks/dl_and_save_lightning.sh

/app/kaminari_API/kaminari_API_rails/lib/tasks/dl_and_save_lightning.sh

#!/bin/sh

sleep 30s
cd /app/kaminari_API/kaminari_API_rails

echo "$(date): executed Lightning.download_nc_file_from_NASA" >> /var/log/cron.log 2>&1
/usr/local/bin/bundle exec /usr/local/bundle/bin/rails runner -e development Lightning.download_nc_file_from_NASA >> /var/log/cron.log 2>&1
echo "$(date): finished Lightning.download_nc_file_from_NASA" >> /var/log/cron.log 2>&1

echo "$(date): executed Lightning.read_csv_and_write_db" >> /var/log/cron.log 2>&1
/usr/local/bin/bundle exec /usr/local/bundle/bin/rails runner -e development Lightning.read_csv_and_write_db >> /var/log/cron.log 2>&1
echo "$(date): finished Lightning.read_csv_and_write_db" >> /var/log/cron.log 2>&1

試したこと

リモートの環境内でps aux | grep cronを実行すると、どうやらちゃんとcronのプロセスが動作しているみたいです(スリープ状態なのでしょうか??)。

root         9  0.0  0.0  25904  2128 ?        Ss   15:14   0:00 cron
root        50  0.0  0.0  11128   980 pts/1    S+   15:36   0:00 grep cron


つまり、cronは問題なく動作しているにも関わらず、/var/log/cron.logに出力結果(エラーも含め)が出力されていないという状況です。

kaminari_API/kaminari_API_cron/api_cronに

* * * * * root echo "hello world!" >> /var/log/cron.log 2>&1


という簡単なコマンドを追加しても/var/log/cron.logが出力されることはありませんでした。。

sh /app/kaminari_API/kaminari_API_rails/lib/tasks/dl_and_save_lightning.shを実行した場合、問題なく動作するため、dl_and_save_lightning.sh自体に問題はありません。

補足情報(FW/ツールのバージョンなど)

# ローカル
Docker version 18.09.2, build 6247962
docker-compose version 1.23.2, build 1110ad01
# リモート
Docker version 18.06.1-ce, build e68fc7a215d7133c34aa18e3b72b4a21fd0c6136
docker-compose version 1.11.2, build dfed245
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

どうやらリモードのコンテナの中でのowerの設定が問題だったようです。
chown root:root /etc/cron.d/api_cron
を実施したところちゃんとcronが実施されました。

/etc/cron.d/にあるファイルについては所有者rootとグループがrootじゃ無いとダメみたいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Rubyに関する質問
  • ローカルで作成したdockerコンテナ内で動いていたcronがリモート(EC2)の中で何故か動作しません。。