如何解决Dokku:部署、构建和服务中间人静态生成的网站
今天,我一直在尝试配置 Dokku 来部署我的一个静态生成的网站(用中间人构建):将中间人源推送到主机,在主机上生成网站,然后告诉 Nginx 为这些网站提供服务静态文件。
-
一个
.buildpacks
文件,包含一个用于构建站点的 buildpack,以及用于提供生成的静态 HTML 文件的 Nginx buildpack:https://github.com/heroku/heroku-buildpack-ruby.git#v222 https://github.com/dokku/buildpack-Nginx.git#v14
-
负责构建站点的预部署操作,使用
app.json
:{ "scripts": { "dokku": { "predeploy": "bundle exec middleman build",} } }
发生了什么?
显然,目前我正在尝试使用 predeploy 钩子构建我的中间人站点,但 bundle 命令不再可用。这是我得到的示例输出:
➜ git push dokku master
Enumerating objects: 397,done.
Counting objects: 100% (397/397),done.
Delta compression using up to 8 threads
Compressing objects: 100% (258/258),done.
Writing objects: 100% (397/397),819.50 KiB | 14.90 MiB/s,done.
Total 397 (delta 195),reused 244 (delta 111),pack-reused 0
remote: Resolving deltas: 100% (195/195),done.
-----> Cleaning up...
-----> Building site from herokuish...
-----> Adding BUILD_ENV to build environment...
-----> Warning: Multiple default buildpacks reported the ability to handle this app. The first buildpack in the list below will be used.
Detected buildpacks: multi ruby static
-----> Multipack app detected
=====> Downloading Buildpack: https://github.com/heroku/heroku-buildpack-ruby.git
=====> Detected Framework: Ruby
-----> Installing bundler 2.1.4
-----> Removing BUNDLED WITH version in the Gemfile.lock
-----> Compiling Ruby/Rack
-----> Using Ruby version: ruby-2.6.3
-----> Installing dependencies using bundler 2.1.4
Running: BUNDLE_WITHOUT='development:test' BUNDLE_PATH=vendor/bundle BUNDLE_BIN=vendor/bundle/bin BUNDLE_DEPLOYMENT=1 bundle install -j4
Using concurrent-ruby 1.1.7
Using i18n 0.9.5
Using minitest 5.14.2
Using thread_safe 0.3.6
Using tzinfo 1.2.7
Using activesupport 5.2.4.4
Using public_suffix 4.0.6
Using addressable 2.7.0
Using execjs 2.7.0
Using autoprefixer-rails 9.8.6.5
Using backports 3.18.2
Using bundler 2.1.4
Using coffee-script-source 1.12.2
Using coffee-script 2.4.1
Using contracts 0.13.0
Using dotenv 2.7.6
Using erubis 2.7.0
Using fast_blank 1.0.0
Using fastimage 2.2.0
Using ffi 1.13.1
Using temple 0.8.2
Using tilt 2.0.10
Using haml 5.2.0
Using hamster 3.0.0
Using hashie 3.6.0
Using rexml 3.2.4
Using kramdown 2.3.0
Using rb-fsevent 0.10.4
Using rb-inotify 0.10.1
Using listen 3.0.8
Using memoist 0.16.2
Using thor 1.0.1
Using middleman-cli 4.3.11
Using padrino-support 0.13.3.4
Using padrino-helpers 0.13.3.4
Using parallel 1.19.2
Using rack 2.2.3
Using sassc 2.4.0
Using servolux 0.13.0
Using uglifier 3.2.0
Using middleman-core 4.3.11
Using middleman 4.3.11
Using middleman-autoprefixer 2.10.1
Bundle complete! 3 Gemfile dependencies,43 gems Now installed.
Gems in the groups development and test were not installed.
Bundled gems are installed into `./vendor/bundle`
Bundle completed (0.52s)
Cleaning up the bundler cache.
-----> Writing config/database.yml to read from DATABASE_URL
-----> Installing node-v12.16.2-linux-x64
-----> Detecting rake tasks
###### WARNING:
No procfile detected,using the default web server.
We recommend explicitly declaring how to boot your server process via a procfile.
https://devcenter.heroku.com/articles/ruby-default-web-server
=====> Downloading Buildpack: https://github.com/dokku/buildpack-Nginx.git
=====> Detected Framework: .static
-----> copy static files to www
-----> Reusing Nginx binary from cache
-----> Using default app-Nginx.conf.sigil
-----> Using default mime.types
Using release configuration from last framework (.static).
-----> discovering process types
Default types for -> web
-----> Releasing site...
-----> deploying site...
-----> Checking for predeploy task
-----> Executing predeploy task from app.json: bundle exec middleman build
=====> Start of site predeploy task (22fcf68dd) output
remote: ! Execution of predeploy task Failed: bundle exec middleman build
/bin/bash: bundle: command not found
remote: 2021/01/02 15:06:19 exit status 1
remote: 2021/01/02 15:06:19 exit status 1
remote: 2021/01/02 15:06:19 exit status 1
=====> End of site predeploy task (22fcf68dd) output
To host:site
! [remote rejected] master -> master (pre-receive hook declined)
error: Failed to push some refs to 'host:site'
我尝试了什么
-
我注意到第一个 buildpack 被执行,然后是第二个,然后 predeploy 钩子开始执行。
-
我尝试删除 Nginx“静态服务”构建包并只保留 ruby 构建包,并在我的预部署挂钩中保留一个
bundle
命令。它起作用了,但我没有收到“找不到命令”错误。所以切换到第二个 buildpack 对我来说似乎是一团糟。 -
我比较了使用和不使用 Nginx“静态服务”构建包的路径,没有什么奇怪的。使用 Nginx buildpack,添加了一个新路径,但之前设置的 ruby 路径仍然存在:
# with only ruby buildpack /app/bin:/app/vendor/bundle/bin:/app/vendor/bundle/ruby/2.6.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # with both ruby & Nginx buildpacks /app/bin:/app/vendor/bundle/bin:/app/vendor/bundle/ruby/2.6.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/app/Nginx
最后,我有点迷失在这里。是预期的吗?我不是在遵循 dokku 的方式吗?是因为权限问题还是我不知道的 Dokku 问题?
现在,作为后备,我通过运行一个接收所有请求的中间人服务器来为网站提供服务,但动态地为静态生成的网站提供服务是没有意义的。
解决方法
感谢 jonrsharpe 的评论,我重新调整了搜索方向和 found this blog post on heroku engineering blog。最终,正如 jonrsharpe 所说:
Nginx buildpack 根本没有 Ruby - 您需要在 Ruby buildpack 上下文中进行任何构建,因此所有静态 buildpack 需要做的就是提供结果。
因此,要启动我的 middleman build
命令,我需要在 ruby buildpack 中的某个地方挂钩。在“jekyll on heroku”链接中,一切都得到了解释:应该覆盖 assets:precompile
rake 任务。
我遵循的步骤
- 将
gem "rake"
添加到我的 Gemfile(当然还有包) - 使用
Rakefile
任务创建assets:precompile
:
task "assets:precompile" do
exec("middleman build")
end
- 享受吧!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。