2015-11-13 64 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窗格。

相关问题