是的,博主突然就成功了,發現之前無限加載原來是 Cloudflare 導致的,由於啓用了 rocket loader 會令網頁 Async 加載 js,估計是那個地方出了點岔子。只要將他關閉就可以了。 這次的 Dockerfile 如下

船新版本
FROM node:latest
# Set the server port as an environmental
ENV HEXO_SERVER_PORT=4000
# Set the git username and email
ENV GIT_USER="ketsuro"
ENV GIT_EMAIL="[email protected]"
# Set the user and group that the file inside docker belongs to  
ENV SCRIPT_USER="ketsuro"
ENV SCRIPT_GROUP="users"
# Install requirements 
RUN \
  apt-get update && \
  apt-get install git -y && \
  npm install hexo-cli -g
# Set workdir
WORKDIR /app
# Expose Server Port
EXPOSE ${HEXO_SERVER_PORT}
# Build a base server and configuration if it doesnt exist, then start
CMD \
  if [ "$(ls -A /app)" ]; then \
    echo "***** App directory exists and has content, continuing *****"; \
  else \
    echo "***** App directory is empty, initialising with hexo and hexo-admin*****" && \
    hexo init && \
    npm install && \
    echo "***** Installing ShokaX ****" && \
    npm add hexo-theme-shokax && \
    echo "***** Continue with hexo admin and server ****" && \
    npm install hexo-admin && \
    npm install hexo-server; \
  fi; \
  if [ ! -f /app/requirements.txt ]; then \
    echo "***** App directory contains no requirements.txt file, continuing *****"; \
  else \
    echo "***** App directory contains a requirements.txt file, installing npm requirements *****"; \
    cat /app/requirements.txt | xargs npm --prefer-offline install; \
  fi; \
  if [ "$(ls -A /app/.ssh 2>/dev/null)" ]; then \
    echo "***** App .ssh directory exists and has content, continuing *****"; \
  else \
    echo "***** App .ssh directory is empty, initialising ssh key and configuring known_hosts for common git repositories (github/gitlab) *****" && \
    rm -rf ~/.ssh/* && \
    ssh-keygen -t rsa -f ~/.ssh/id_rsa -q -P "" && \
    ssh-keyscan github.com > ~/.ssh/known_hosts 2>/dev/null && \
    ssh-keyscan gitlab.com >> ~/.ssh/known_hosts 2>/dev/null && \
    cp -r ~/.ssh /app; \
  fi; \
  echo "***** Running git config, user = ${GIT_USER}, email = ${GIT_EMAIL} *****" && \
  git config --global user.email ${GIT_EMAIL} && \
  git config --global user.name ${GIT_USER} && \
  echo "***** Copying .ssh from App directory and setting permissions *****" && \
  cp -r /app/.ssh ~/ && \
  chmod 600 ~/.ssh/id_rsa && \
  chmod 600 ~/.ssh/id_rsa.pub && \
  chmod 700 ~/.ssh && \
  echo "***** Contents of public ssh key (for deploy) - *****" && \
  cat ~/.ssh/id_rsa.pub && \
  echo "***** Starting server on port ${HEXO_SERVER_PORT} *****" && \
	useradd ${SCRIPT_USER} || echo "User already exists. Skipping" && \
	groupadd ${SCRIPT_GROUP} || echo "Group already exists. Skipping" && \
  chmod -R 777 /app && \
	chown -R ${SCRIPT_USER}:${SCRIPT_GROUP} /app && \
  hexo server -d -p ${HEXO_SERVER_PORT}

相比起上一次失敗,我往 dockerfile 裏面新增了兩個 ENV variables, SCRIPT_USER and SCRIPT_GROUP 。由於我會經常修改 docker 的 volume 裏面 config 還有 md 文件,如果不更改一下歸屬的話會令我每次更改都要 save as root。

# 食用方法

首先開啓一個名為 Dockerfile 的文件,複製以上内容進去。出去 bash 並輸入

docker build -t [your_image_name]:[image_version] .

如此,docker 就會幫你將當前目錄下面的 dockerfile 以你所設立的 your_image_name 以及版本建立成 image。

接著要做的就是把 docker 開出來。我使用了 docker compose 他輔助我一次性開啓 nginx 跟 gitea 等多個服務。 Hexo 也被包括了在内。創建一個 docker-compose.yml 的文件,並修改它。我的 compose 設定如下:

hexo:
  container_name: hexo
  restart: always
  image: hexo:101 
  environment:
    - HEXO_SERVER_PORT=[port]
    - GIT_USER="[git_user_name]"
    - GIT_EMAIL="[git_email_adress]"
    - SCRIPT_USER="[your os user]"
    - SCRIPT_GROUP="[your os group]"
  expose: # use port: and [host port]:[docker port] if you don't use nginx under the same compose file
    - [port]
  volumes:
    - ./hexo:/app
  links:
    - twikoo # needed if you have twikoo deployed under same file

這邊我使用了 expose 來放 port,因爲我用了一個 compose 文件一起將他們打開,如果你不打算使用 nginx,或者 nginx 與 hexo 不會處於一個 network 底下,請使用 port 來轉發端口到宿主機。
同時間,links 也是非必要項目,如果你選擇在本地部署 twikoo 才會使用到他。

# 運行 docker compose

當一切的一切都搞定后,回到 bash 並進入與 docker-compose.yml 相同的目錄並運行 docker compose up -d ,你的 image 就都會變成一個個 container(容器)在後臺跑起來了。

剩下你可以對其進行的操作有

  • 重啓整個 compose file 底下的容器 docker compose restart
  • 關閉整個 compose file 底下的容器 docker compose down
  • 在以上指令後面加上指定的容器,這樣子做的好處是他會自動幫你一起處理 link 過的容器
  • 最後就是在 docker 裏面運行指令 docker exec -it [container] [command]
    • 可以透過 docker exec -it [container] bash 進入容器裏面可以交互的 bash

# 完成

剩下來的,就是 shokax 官方文檔裏面設定了。基本跟著走就沒問題了。。。。。。吧?

總瀏覽次數:載入中...更新於

請我喝[茶]~( ̄▽ ̄)~*

ketsuro 微信支付

微信支付

ketsuro 支付寶

支付寶