2015-11-13 102 views
0

我已經嘗試了很多方法來將我的導軌應用程序構建爲泊塢窗圖像。並將其部署到谷歌容器引擎。但直到現在,沒有人成功。如何使用kubernetes將rails應用程序部署到Google容器引擎?

我Dockerfile(在軌根路徑)

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創建網絡控制器:

kubectl create -f web-controller.yml 

,看到了莢日誌:

kubectl logs web-controller-xxxxx 

它表明:

init.sh: 2: init.sh: bundle: not found 
init.sh: 3: init.sh: bundle: not found 

似乎找不到路徑。那該怎麼辦?

回答

1

您可以使用kubectl exec來輸入您的容器並打印環境。 http://kubernetes.io/v1.1/docs/user-guide/getting-into-containers.html

例如: kubectl EXEC網絡控制器-XXXXX SH -c printenv

你也可以使用kubectl交互,以確認包是在容器中的圖像:

kubectl EXEC -ti網-controller -xxxx sh

如果bundle位於映像中,則可以將其目錄添加到init.sh中的PATH中,或者在每個命令中明確指定其路徑。

1

也許你應該直接執行init.sh而不是sh init.sh?看起來$PATH和其他ENV變量沒有爲sh init.sh shell設置。如果您可以將exec放入容器中,並且which bundle顯示要綁定的路徑,那麼當使用sh init.sh執行時,您將失去登錄ENV。

如果有幫助,我已經寫了a how-to在KKE上部署GKE上的Rails。你可能想要改變的一件事是,如果你有幾個你的網絡豆莢運行,他們將所有運行init.sh腳本,他們將所有嘗試db:migrate。將有一個遷移的種族條件,以什麼順序(如果你有很多)。您可能只想在部署期間從一個容器運行db:migrate。您可以使用Kubernetes Job完成該任務,或者使用kubectl run migrator --image=us.gcr.io/your/image --rm --restart=Never或類似命令執行db:migrate任務,然後才能推出新的Web窗格。

相關問題