Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails docker中的ruby unicorn作为服务-使用了错误的rake_Ruby On Rails_Docker_Rake_Unicorn - Fatal编程技术网

Ruby on rails docker中的ruby unicorn作为服务-使用了错误的rake

Ruby on rails docker中的ruby unicorn作为服务-使用了错误的rake,ruby-on-rails,docker,rake,unicorn,Ruby On Rails,Docker,Rake,Unicorn,我的问题是,我可以在docker中将unicorn作为一项服务启动,但如果我从命令行启动它,它的工作就可以了 尝试使用unicorn和nginx web服务器docker映像构建ruby。 用作ruby:2.3的基础。但最新的ubuntu也遇到了同样的问题。 本文非常直接地解释了如何将unicorn与nginx结合使用。 如果我像这样从bash开始,一切似乎都正常 (cd/app&bundle exec unicorn-c/app/config/unicorn.rb-E uat-D) 但如果启动

我的问题是,我可以在docker中将unicorn作为一项服务启动,但如果我从命令行启动它,它的工作就可以了

尝试使用unicorn和nginx web服务器docker映像构建ruby。 用作ruby:2.3的基础
。但最新的ubuntu也遇到了同样的问题。
本文非常直接地解释了如何将unicorn与nginx结合使用。
如果我像这样从bash开始,一切似乎都正常
(cd/app&bundle exec unicorn-c/app/config/unicorn.rb-E uat-D)

但如果启动它作为服务,我会看到错误
service unicorn\u appname start

错误是:
bundler:未找到命令:unicorn

在我做了一些调查之后,我意识到问题最有可能出现在env变量中,因为服务实际上试图使用
su-root-c
前缀执行我的命令:

su-root-c“cd/app&bundle exec unicorn-c config/unicorn.rb-E uat-D”

此命令产生相同的错误

虽然我在bash中也是以root身份登录的

在谷歌搜索了一段时间后,我发现部分解决方案-设置PATH env变量如下:

su-root-c“PATH=\”$(ruby-e'print Gem.default\u dir')/bin:$PATH\”&cd/app&&bundle exec unicorn-c config/unicorn.rb-e uat-D“

但是现在我看到
在任何源代码中都找不到rake-12.0.0

rake--version
返回
rake,version 12.0.0
。同时
su-root-c“rake--version”
返回
rake,版本10.4.2

which rake
返回
/usr/local/bundle/bin/rake
,同时
su-root-c“which rake”
返回
/usr/local/bin/rake

所以我猜该服务试图为rake使用错误的路径。

如何更改默认的rake路径?或任何其他建议

-----------更新-类似的解决方案-----------------

我想我在docker找到了bundler所有问题的原因。看起来bundler的所有环境变量都是在shell启动部分中设置的。因此,如果我以sudo
su-appuser-c“…cmd…”

因此,我通过在bash中运行
printenv
对其进行了测试。还有一个像这样的
sudo su-appuser-c“printenv”
-发现了很大的不同

因为我在构建docker,所以我通过docker文件设置了它们,但如果只是导出它们,它也可以工作

ENV PATH=/usr/local/bundle/bin:/usr/local/bundle/gems/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV RUBYGEMS_VERSION=3.0.3
ENV RUBY_VERSION=2.3.8
ENV GEM_HOME=/usr/local/bundle
ENV BUNDLE_PATH=/usr/local/bundle
ENV BUNDLE_SILENCE_ROOT_WARNING=1
ENV RUBY_MAJOR=2.3
ENV BUNDLE_APP_CONFIG=/usr/local/bundle
我也有

RUN bundle config app_config /usr/local/bundle && bundle config path /usr/local/bundle
由于正确的方法是不在web应用程序中使用root,因此我在docker文件中重建了所有内容,以便它创建并使用单独的用户(但我想这部分是可选的):

希望我的更新能节省一些时间

RUN adduser --disabled-password --gecos "" appuser
....
#installing sudo
RUN apt-get update
RUN apt-get install -y sudo
....
# gives sudo to new user
RUN echo "appuser ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/appuser && chmod 0440 /etc/sudoers.d/appuser
....
#don't forget to give rights to your folder for new user like this:
#RUN sudo chown -R appuser:appuser /usr/local
....
#utilize new user
USER appuser
#bundle install and rest stuff is here
....