如何解决Dokku部署中的预接收挂钩拒绝错误?

时间:2017-11-29 18:54:36

标签: git angular docker dokku

我目前正在dokku实例上部署Angular4应用程序,但是,我一直收到此错误! [remote rejected] develop -> master (pre-receive hook declined)

我正在从开发分支部署到master,因此我按照git push mediafactory develop:master

运行部署命令

我正在通过Dockerfile进行部署,看起来像这样;

FROM node:carbon

RUN mkdir -p  /opt/app
WORKDIR /opt/app

COPY package*.json ./

RUN npm install --save @angular/cli@1.3.0
RUN npm install --only=production

COPY .angular-cli.json .
COPY . .

RUN ng build --aot -prod

ENV APP_ID setYourAppId
ENV MASTER_KEY setYourMasterKey
ENV DATABASE_URI setMongoDBURI

EXPOSE 1337

CMD ["npm", "start"]

我试过了

sudo wget -O /etc/init/docker.conf https://raw.github.com/dotcloud/docker/master/contrib/init/upstart/docker.conf

sudo service docker restart

但是,它似乎无法解决问题。

1 个答案:

答案 0 :(得分:3)

我终于得到了问题的解决方案。我知道有人可能会遇到和我一样的问题。

为什么会出现上述问题主要有三个原因。

首先,如果你遇到这个错误,

remote: <app name> is currently being deployed. Exiting...
To <dokku remote>:<app name>
! [remote rejected] develop -> master (pre-receive hook declined)

您可以通过从dokku主机运行这两个命令轻松解决上述问题。

$ sudo wget -O /etc/init/docker.conf https://raw.github.com/dotcloud/docker/master/contrib/init/upstart/docker.conf

$ sudo service docker restart

其次,就我的情况而言,全局节点模块文件夹的权限存在问题,当您尝试全局安装@ angular / cli时会导致无限循环。不幸的是,即使提供权限,pre-receive hook declined错误也会持续存在。这是因为我正在使用的@ ngular / cli图像。

错误看起来像这样

...
/usr/local/lib/node_modules/@angular/cli/node_modules/node-sass/.node-
gyp/8.9.1
gyp WARN EACCES user "nobody" does not have permission to access the 
dev dir 
"/usr/local/lib/node_modules/@angular/cli/node_modules/node-sass/.node-
gyp/8.9.1"
gyp WARN EACCES attempting to reinstall using temporary dev dir 
"/usr/local/lib/node_modules/@angular/cli/node_modules/node-sass/.node-gyp"
...

您可以通过向Dockerfile添加以下行来解决上述错误,当且仅当命令$ npm config get prefix返回/usr/local之类的内容时,否则您可能会弄乱您的权限。

RUN chown -R $(whoami) $(npm config get prefix)/lib/node_modules

使用此命令在容器中全局安装@ angular / cli

RUN npm install -g --unsafe-perm @angular/cli

这是解决问题的方法。

可能导致此问题的另一个问题是将package-lock.json添加到您的容器中。您也可以考虑忽略它,因为它可能会导致同样的问题。 因此,新的Dockerfile看起来像这样;

FROM node:carbon

RUN mkdir -p  /opt/app
WORKDIR /opt/app

RUN chown -R $(whoami) $(npm config get prefix)/lib/node_modules

RUN npm install -g --unsafe-perm @angular/cli

COPY package.json .

RUN npm install --only=production

COPY .angular-cli.json .
COPY . .

RUN ng build --aot -prod

ENV APP_ID setYourAppId
ENV MASTER_KEY setYourMasterKey
ENV DATABASE_URI setMongoDBURI

EXPOSE 1337

CMD ["npm", "start"]

第三个也是最后一个,如果您使用Vagrant dokku安装,pre-receive hook declined错误可能是由于虚拟机内存分配不足造成的。

您可以编辑dokku repo的Vagrantfile并为虚拟机分配更多内存。例如,您可以通过在Vagrantfile添加以下行来将内存从1GB增加到2GB;

config.vm.provider :virtualbox do |vb|
  vb.customize ["modifyvm", :id, "--memory", 2048]
end

之后,您运行$ vangrant reload以应用您在Vagrant文​​件中指定的更改。

如果问题仍然存在,并且您使用的是mongoDB,则可能需要检出mongo实例,并确保它们按预期运行。您可以通过在dokku主机上运行$ dokku mongo:list来检查您的mongo实例状态。

最后,如果以上都没有帮助,问题仍然存在,您可能需要销毁您的dokku应用并重新创建一个新应用。在做这件事之前,请特别注意!

You may checkout a tutorial I wrote about deploying 2 apps in the same docker container, with dokku