rubyonrailsをKubernetes(Google Kubernetes Engine)上でjobを実行するとエラーがでる。
実行してみました。
CentOS7とRails5とMySQL5.7で使う(1) - Qiita
DockerのCentOSイメージを取得して、Railsアプリを動かすまで
で今回ローカルにruby2.4とrails5.2.2を作って
FROM ruby:2.4.1-alpine
RUN apk update && apk upgrade && apk add --update --no-cache alpine-sdk tzdata postgresql-dev nodejs
RUN mkdir /app
WORKDIR /app
ARG BUNDLE_OPTIONS
ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock
RUN bundle install --path vendor/bundle -j4
ADD . /app
RUN bundle exec rake assets:precompile
EXPOSE 3000
を作り
その後上記のdocker buildしたimageで進め無事
NAME READY STATUS RESTARTS AGE
postgresql-85b6cbb544-rzb22 1/1 Running 0 18m
rails-5995b6b985-gl6lz 1/1 Running 0 15m
最後job.ymlとdeploy.shdeploy-tasks.shを作りました
job.yml
apiVersion: batch/v1
kind: Job
metadata:
name: deploy-tasks
spec:
template:
metadata:
name: deploy-tasks
labels:
name: deploy-tasks
spec:
nodeSelector:
cloud.google.com/gke-nodepool: default-pool
restartPolicy: Never
containers:
- name: deploy-tasks-runner
image: $RAILS_IMAGE
command: ["/app/script/deploy-tasks.sh"]
env:
- name: RAILS_ENV
value: "production"
- name: DATABASE_HOST
value: postgresql
- name: DATABASE_USERNAME
valueFrom:
secretKeyRef:
name: rails
key: database_user
- name: DATABASE_PASSWORD
valueFrom:
secretKeyRef:
name: rails
key: database_password
- name: SECRET_KEY_BASE
valueFrom:
secretKeyRef:
name: rails
key: secret_key_base
- name: DATABASE_PORT
value: "5432"
deploy-tasks.sh
#!/bin/sh
set -e
bundle exec rails db:create
bundle exec rails db:migrate
deploy.sh
#!/bin/bash
# 前のJobが残っていたらまずは消す
kubectl delete job deploy-tasks 2&> /dev/null || true
# マイグレート用のJobを作成し、実行します
cat kubernetes/deploy-tasks-job.yml | envsubst | kubectl create -f -
# Jobが正常に実行されるまで待ちます
while [ true ]; do
phase=`kubectl get pods -a --selector="name=deploy-tasks" -o 'jsonpath={.items[0].status.phase}' || 'false'`
if [[ "$phase" != 'Pending' ]]; then
break
fi
done
# Jobの終了状態を取得します
while [ true ]; do
succeeded=`kubectl get jobs deploy-tasks -o 'jsonpath={.status.succeeded}'`
failed=`kubectl get jobs deploy-tasks -o 'jsonpath={.status.failed}'`
if [[ "$succeeded" == "1" ]]; then
break
elif [[ "$failed" -gt "0" ]]; then
kubectl describe job deploy-tasks
kubectl delete job deploy-tasks
echo 'マイグレートに失敗!'
exit 1
fi
done
kubectl delete job deploy-tasks || true
そのあと
export RAILS_IMAGE=us.gcr.io/rails-test-182304/rails:latest
./script/deploy.sh
を実行したところデータベースの作成&マイグレーションの実行でエラーがでました
エラー内容は
cat: kubernetes/deploy-tasks-job.yml: No such file or directory
error: no objects passed to create
Flag --show-all has been deprecated, will be removed in an upcoming release
error: error executing jsonpath "{.items[0].status.phase}": Error executing template: array index out of bounds: index 0, length 0. Printing more information for debugging the template:
template was:
{.items[0].status.phase}
object given to jsonpath engine was:
map[string]interface {}{"kind":"List", "apiVersion":"v1", "metadata":map[string]interface {}{"selfLink":"", "resourceVersion":""}, "items":[]interface {}{}}
Error from server (NotFound): jobs.batch "deploy-tasks" not found
です。
フィルダーの位置が違うのかと思い、いろいろ試行錯誤してみたんですが、だめでした
フォルダーは
kubernetes/の中に
job.yml
postgresql-service.yml
postgresql.yml
rails-service.yml
rails.yml
script/の中に
deploy.sh
deploy-tasks.sh
が入っています。
docker buildのエラーではないようですがなんとか最後の部分成功させたいです。
すいませんが、よろしくお願いします。
見にくかったら、修正します。