[英]How to deploy a rails app to google container engine with kubernetes?
我嘗試了許多方法將Rails應用構建為Docker映像。 並將其部署到Google容器引擎。 但是直到現在,還沒有人成功。
我的Dockerfile(在rails根路徑下)
FROM ruby:2.2.2
RUN apt-get update -qq && apt-get install -y build-essential
RUN apt-get install -y nodejs
ENV APP_HOME /myapp
RUN mkdir $APP_HOME
WORKDIR $APP_HOME
ADD Gemfile $APP_HOME/Gemfile
ADD Gemfile.lock $APP_HOME/Gemfile.lock
ADD vendor/gems/my_gem $APP_HOME/vendor/gems/my_gem
ADD init.sh $APP_HOME/
RUN export LANG=C.UTF-8 && bundle install
ADD . $APP_HOME
CMD ["sh", "init.sh"]
我的init.sh
#!/bin/bash
bundle exec rake db:create db:migrate
bundle exec rails server -b 0.0.0.0
我的kubernetes配置文件
apiVersion: v1
kind: ReplicationController
metadata:
labels:
name: web
name: web-controller
spec:
replicas: 2
selector:
name: web
template:
metadata:
labels:
name: web
spec:
containers:
- name: web
image: gcr.io/my-project-id/myapp:v1
ports:
- containerPort: 3000
name: http-server
env:
- name: RAILS_ENV
value: "production"
在我用kubectl在gke上創建Web控制器后:
kubectl create -f web-controller.yml
並查看pod日志:
kubectl logs web-controller-xxxxx
表明:
init.sh: 2: init.sh: bundle: not found
init.sh: 3: init.sh: bundle: not found
似乎找不到路徑。 那該怎么辦?
您可以使用kubectl exec輸入您的容器並打印環境。 http://kubernetes.io/v1.1/docs/user-guide/getting-into-containers.html
例如:kubectl exec web-controller-xxxxx sh -c printenv
您還可以交互使用kubectl來確認捆綁包在您的容器映像中:
kubectl執行程序-ti web-controller-xxxxx sh
如果bundle在您的映像中,則將其目錄添加到init.sh中的PATH中,或在每個命令中顯式指定其路徑。
也許您應該直接執行init.sh
而不是sh init.sh
? 似乎沒有為該sh init.sh
shell設置$PATH
以及其他ENV變量。 如果可以exec
到容器中,並且which bundle
顯示了which bundle
的路徑,那么使用sh init.sh
執行時,您將丟失登錄sh init.sh
。
如果有幫助的話,我已經寫了一個使用Kubernetes在GKE上部署Rails的方法。 你可能想改變的一件事是,如果你有幾個你的web莢運行,它們都將運行init.sh
腳本,他們都會嘗試db:migrate
。 會有一個遷移條件,以及遷移順序(如果您有很多的話)。 您可能只想在部署期間從一個容器運行db:migrate
。 您可以使用Kubernetes作業來完成該任務,也可以使用kubectl run migrator --image=us.gcr.io/your/image --rm --restart=Never
執行類似的操作db:migrate
在推出您的db:migrate
之前僅執行一次db:migrate
任務新的Web連播。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.