background
2
t
l
@
w
8
z
u
:
>
R
|
r
m
E
M
E
(
p
2
W
s
:
3
{
{
H
2
g
p
o
<

favicon
favicon
Reverier's Blog
 

A Simple Docker-Based Fix for Updating My Blog

Reverier-Xu at 2020-05-16 04:40:54 Web Development CC-BY-NC-SA 4.0

The error

Running hexo failed with: Hexo deploy error #4281

$ hexo g -d
(node:482144) Warning: Accessing non-existent property 'lineno' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
(node:482144) Warning: Accessing non-existent property 'column' of module exports inside circular dependency
(node:482144) Warning: Accessing non-existent property 'filename' of module exports inside circular dependency
(node:482144) Warning: Accessing non-existent property 'lineno' of module exports inside circular dependency
(node:482144) Warning: Accessing non-existent property 'column' of module exports inside circular dependency
(node:482144) Warning: Accessing non-existent property 'filename' of module exports inside circular dependency
INFO  Files loaded in 842 ms
INFO  0 files generated in 669 ms
INFO  Deploying: git
INFO  Clearing .deploy_git folder...
INFO  Copying files from public folder...
FATAL Something's wrong. Maybe you can find the solution here: https://hexo.io/docs/troubleshooting.html
TypeError [ERR_INVALID_ARG_TYPE]: The "mode" argument must be integer. Received an instance of Object
    at copyFile (fs.js:1890:10)
    at tryCatcher (/home/reverier/文档/Blog/node_modules/bluebird/js/release/util.js:16:23)
    at ret (eval at makeNodePromisifiedEval (/usr/lib/node_modules/hexo-cli/node_modules/bluebird/js/release/promisify.js:184:12), <anonymous>:13:39)
    at /home/reverier/文档/Blog/node_modules/hexo-fs/lib/fs.js:144:39
    at tryCatcher (/home/reverier/文档/Blog/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/home/reverier/文档/Blog/node_modules/bluebird/js/release/promise.js:547:31)
    at Promise._settlePromise (/home/reverier/文档/Blog/node_modules/bluebird/js/release/promise.js:604:18)
    at Promise._settlePromise0 (/home/reverier/文档/Blog/node_modules/bluebird/js/release/promise.js:649:10)
    at Promise._settlePromises (/home/reverier/文档/Blog/node_modules/bluebird/js/release/promise.js:729:18)
    at Promise._fulfill (/home/reverier/文档/Blog/node_modules/bluebird/js/release/promise.js:673:18)
    at Promise._resolveCallback (/home/reverier/文档/Blog/node_modules/bluebird/js/release/promise.js:466:57)
    at Promise._settlePromiseFromHandler (/home/reverier/文档/Blog/node_modules/bluebird/js/release/promise.js:559:17)
    at Promise._settlePromise (/home/reverier/文档/Blog/node_modules/bluebird/js/release/promise.js:604:18)
    at Promise._settlePromise0 (/home/reverier/文档/Blog/node_modules/bluebird/js/release/promise.js:649:10)
    at Promise._settlePromises (/home/reverier/文档/Blog/node_modules/bluebird/js/release/promise.js:729:18)
    at Promise._fulfill (/home/reverier/文档/Blog/node_modules/bluebird/js/release/promise.js:673:18)
    at Promise._resolveCallback (/home/reverier/文档/Blog/node_modules/bluebird/js/release/promise.js:466:57)
    at Promise._settlePromiseFromHandler (/home/reverier/文档/Blog/node_modules/bluebird/js/release/promise.js:559:17)
    at Promise._settlePromise (/home/reverier/文档/Blog/node_modules/bluebird/js/release/promise.js:604:18)
    at Promise._settlePromise0 (/home/reverier/文档/Blog/node_modules/bluebird/js/release/promise.js:649:10)
    at Promise._settlePromises (/home/reverier/文档/Blog/node_modules/bluebird/js/release/promise.js:729:18)
    at Promise._fulfill (/home/reverier/文档/Blog/node_modules/bluebird/js/release/promise.js:673:18)

The official reply

@Reverier-Xu @stephen-a2z @dumindu @pwittchen
 
We published v4.2.1.
v4.2.1 has included fixed compatible with Node 14.
 
Thanks :)

Unfortunately, the problem was still there even after updating to 4.2.1.

Looking for another way out

Downgrade Node.js?

sudo pacman -U /var/cache/pacman/pkg/nodejs-13.13.0-1-x86_64.pkg.tar.zst

Downgrading through the local pacman cache to 13.13 worked for about a week.

Then the Node.js dependency stack updated.

And that was the end of that.

If I wanted to keep using a downgraded Node.js, I would have had to downgrade the dependencies as well, then downgrade everything those packages depended on, and then maybe keep downgrading until the upstream project finally handled Node 14.2 properly.

But this was Arch Linux. A downgrade? A large-scale downgrade? By the time upstream fixed the issue, updating again would probably break the whole machine in some new and exciting way.

A virtual machine?

Spinning up a Linux VM inside Linux just to update a blog? I did not feel quite that far gone yet.

Docker? Docker is the answer

So I went with docker instead.

After installing docker, pull the official image:

sudo docker pull node:13.14.0-stretch

Then start a docker environment with the blog directory mounted in, and map Hexo’s 4000 port to the local machine:

sudo docker run -it -p 4000:4000 -v <Blog Location>:/Blog node:13.14.0-stretch /bin/bash

Install the dependencies, configure Git SSH keys, then run sudo docker ps -l to get the container pid, and after that:

sudo docker commit <pid> node:13.14.0-stretch

That saves the configured environment.

Then write a simple .desktop file:

[Desktop Entry]
Comment=
Exec=konsole -e 'sudo docker run -it -p 4000:4000 -v /home/reverier/Documents/Blog:/Blog node:13.14.0-stretch /bin/bash'
GenericName=Docker Blog
Icon=
Name=Blog
NoDisplay=false
Path[$e]=
StartupNotify=true
Terminal=0
TerminalOptions=
Type=Application
X-KDE-SubstituteUID=false
X-KDE-Username=

Drop it into ~/.local/share/applications.

From there, the writing workflow stays exactly the same. Once a post is ready, click the desktop entry, enter the root password, and update the blog as usual.

Wrapping up

I picked up a bit of basic docker usage along the way, and honestly it felt pretty nice.