使用Docker搭建Chirpy部落格

n1ce2cv發表於2024-10-25

使用Docker搭建Chirpy部落格

成功版

docker pull n1ce2cv/chirpyblog

docker run -dit --name blogok -p 4100:4000 -v .:/srv/jekyll --workdir /srv/jekyll chirpyblog:v1.0 bundle exec jekyll serve --host 0.0.0.0 --port 4000

失敗版1(待解決)

方案:基於 debian:bullseye,構建一個新的映象,用於部署。

修改基礎映象 debian:bullseye

# 更新源
cat > /etc/apt/sources.list << EOF
deb http://mirrors.ustc.edu.cn/debian bullseye main contrib non-free
deb http://mirrors.ustc.edu.cn/debian bullseye-updates main contrib non-free
deb http://mirrors.ustc.edu.cn/debian bullseye-backports main contrib non-free
deb-src http://mirrors.ustc.edu.cn/debian bullseye-backports main contrib non-free
EOF

# 更新系統
sudo apt update
sudo apt upgrade -y

# 安裝構建 Ruby 所需的依賴包
sudo apt install -y build-essential libssl-dev libreadline-dev zlib1g-dev
# 使用 rbenv 來管理 Ruby 版本。首先,安裝 rbenv 和 ruby-build
# 安裝 git
sudo apt install -y git
# 克隆 rbenv 倉庫
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
# 設定環境變數
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc
# 克隆 ruby-build 倉庫
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
# 安裝完成後,rbenv 就可以使用 curl 或 wget 來下載所需的依賴包
sudo apt install -y curl wget
# 安裝 OpenSSL 和相關依賴
sudo apt install -y libssl-dev zlib1g-dev build-essential libreadline-dev
sudo apt install -y libffi-dev libyaml-dev
rbenv install 3.3.5
# 設定全域性使用 Ruby 3.3.5
rbenv global 3.3.5
# 確認 Ruby 安裝成功並檢查版本
ruby -v

# Ruby 安裝完成後,Gem 會自動安裝。然後可以安裝 Bundler
gem install bundler -v 2.3.25

# 使用 Bundler 安裝 Jekyll:
gem install jekyll -v 4.3.4

# 驗證安裝
ruby -v      # 應該顯示 3.3.5
gem -v       # 應該顯示 3.5.16
bundler -v   # 應該顯示 2.5.16
git --version # 應該顯示 2.30.2
jekyll -v    # 應該顯示 4.3.4

製作映象 debianchirpy:latest

啟動容器

docker run -dit --name blogtest -p 4200:4000 -v .:/srv/jekyll --workdir /srv/jekyll debianchirpy:latest /bin/bash

進入容器內 /srv/jekyll 更新包

bundle install

然後啟動部落格,啟動失敗

bundle exec jekyll serve --host 0.0.0.0 --port 4000

失敗版2(待解決)

方案:基於 debian:bullseye,構建一個新的映象,用於部署。

構建映象

Dockfile 檔案(確保在部落格的根目錄下):

FROM jekyll/jekyll:latest

# 將當前目錄中的檔案複製到容器中的 /srv/jekyll
COPY . /srv/jekyll

# 設定工作目錄
WORKDIR /srv/jekyll

# 安裝依賴並構建站點
RUN bundle install

# 啟動服務
CMD ["jekyll", "serve", "--host", "0.0.0.0", "--port", "4000", "--watch"]

docker-compose.yml 檔案(確保在部落格的根目錄下):

services:
chirpy:
build:
  context: .
  dockerfile: Dockerfile
image: chirpyblog # 設定映象名稱
ports:
      - "8888:4000" # 將容器的 4000 埠對映到宿主機的 8888 埠
    volumes:
      - .:/srv/jekyll # 將本地目錄掛載到容器內,以便實時更新
    environment:
      - JEKYLL_ENV=production # 設定環境變數

然後在部落格的根目錄下執行構建命令 docker compose build

root@spring:~/GithubRepo/sprinining.github.io# docker compose build
[+] Building 685.0s (10/10) FINISHED                                                                        docker:default
 => [chirpy internal] load build definition from Dockerfile                                                           0.0s
 => => transferring dockerfile: 343B                                                                                  0.0s
 => [chirpy internal] load metadata for docker.io/jekyll/jekyll:latest                                                0.0s
 => [chirpy internal] load .dockerignore                                                                              0.0s
 => => transferring context: 2B                                                                                       0.0s
 => [chirpy internal] load build context                                                                              0.1s
 => => transferring context: 65.25kB                                                                                  0.0s
 => CACHED [chirpy 1/4] FROM docker.io/jekyll/jekyll:latest                                                           0.0s
 => [chirpy 2/4] COPY . /srv/jekyll                                                                                   0.4s
 => [chirpy 3/4] WORKDIR /srv/jekyll                                                                                  0.1s
 => [chirpy 4/4] RUN bundle install                                                                                 682.2s
 => [chirpy] exporting to image                                                                                       2.1s 
 => => exporting layers                                                                                               2.0s 
 => => writing image sha256:288e34cbff59701f4d6e95b404d71b2a190ab875f958c5c0a1b8a353d97a1fab                          0.0s 
 => => naming to docker.io/library/chirpyblog                                                                         0.0s 
 => [chirpy] resolving provenance for metadata file                                                                   0.0s 

執行容器

  • 手動執行(推薦)
docker run -dit --name test -v .:/srv/jekyll -p 8888:4000 chirpyblog:latest /bin/bash
  • 透過 docker-compose.yml 執行
docker compose up -d

啟動部落格

進入容器的終端後,在容器內執行下面的命令,會生成 _site 目錄,其中包含網站的靜態檔案:

jekyll serve --host 0.0.0.0 --port 4000 --watch

常見報錯

報錯 1:fatal: detected dubious ownership in repository at '/srv/jekyll' To add an exception for this directory, call: git config --global --add safe.directory /srv/jekyll

進入容器內部修改檔案許可權:

chmod -R 777 /srv/jekyll

報錯 2:Conversion error: Jekyll::Converters::Scss encountered an error while converting 'assets/css/jekyll-theme-chirpy.scss':

匯入缺失的檔案 assets/css/jekyll-theme-chirpy.scss,放到主機的這個位置就行,會同步到容器內,因為設定了目錄掛載。

報錯 3(未解決):fatal: detected dubious ownership in repository at '/srv/jekyll'

容器內執行(git最好大於 2.35 版本):

git config --global --add safe.directory /srv/jekyll

無法把 git 升級到 2.35 版本,軟體源沒有這個版本。

相關文章