如何使用kubernetes将rails应用程序部署到Google容器引擎?

我已经尝试了很多方法来构build我的rails应用程序到一个泊坞窗的图像。 并将其部署到谷歌容器引擎。 但直到现在,没有人成功。

我的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 

我的kubernetesconfiguration文件

 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创buildweb控制器之后:

 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 

似乎没有findpath。 那怎么办?

您可以使用kubectl exec来input您的容器并打印环境。 http://kubernetes.io/v1.1/docs/user-guide/getting-into-containers.html

例如:kubectl exec web-controller-xxxxx sh -c printenv

您也可以使用kubectl以交互方式确认捆绑包在您的容器图像中:

kubectl exec -ti web-controller-xxxxx sh

如果bundle位于映像中,则可以将其目录添加到init.sh中的PATH中,或者在每个命令中明确指定其path。

也许你应该直接执行你的init.sh而不是sh init.sh ? 看起来$PATH和其他ENVvariables没有被设置为sh init.sh shell。 如果你可以在容器中执行, which bundle显示了which bundle的path,那么当你使用sh init.sh执行时,你将失去login的sh init.sh

如果有帮助的话,我已经写了一个关于如何在KKE上部署GKE的Rails。 你可能想要改变的一件事是,如果你有几个你的networking豆荚运行,他们都将运行init.sh脚本,他们都会尝试db:migrate 。 将有一个迁移的种族条件,以什么顺序(如果你有很多)。 您可能只想在部署期间从一个容器运行db:migrate 。 您可以使用Kubernetes作业来完成该操作,或者使用kubectl run migrator --image=us.gcr.io/your/image --rm --restart=Never在执行db:migrate任务之前,新的networking豆荚。