1:创建 Harbor 系统服务文件

  1. 新建服务文件
    在 /etc/systemd/system/ 目录下创建 harbor.service(若已创建过可直接修改):

    bash

    sudo vim /etc/systemd/system/harbor.service
    

  2. 写入服务配置
    内容如下(关键:设置依赖 Docker 服务,确保 Docker 启动后再启动 Harbor):

    ini

    [Unit]
    Description=Harbor Container Registry
    After=docker.service  # 确保 Docker 启动后再启动 Harbor
    Requires=docker.service  # 依赖 Docker 服务,Docker 未启动则 Harbor 不启动
    
    [Service]
    Type=oneshot
    RemainAfterExit=yes  # 服务启动后保持 active 状态
    WorkingDirectory=/home/shitou/harbor  # 替换为你的 Harbor 安装目录(含 docker-compose.yml)
    ExecStart=/usr/bin/docker compose up -d  # 启动命令(使用 docker compose 或 docker-compose,根据系统实际情况选择)
    ExecStop=/usr/bin/docker compose down  # 停止命令
    Restart=on-failure  # 若启动失败,自动重试
    
    [Install]
    WantedBy=multi-user.target  # 多用户模式下自启
    

    • 注意:ExecStart 和 ExecStop 中的 docker compose 若提示命令不存在,替换为 docker-compose(取决于系统安装的是哪个命令)。

步骤 2:重载系统服务并启用自启

  1. 重载服务配置
    让 systemd 识别新创建的服务:

    bash

    sudo systemctl daemon-reload
    

  2. 设置开机自启
    启用 Harbor 服务,使其在系统启动时自动运行:

    bash

    sudo systemctl enable harbor.service
    

步骤 3:验证配置

  1. 查看服务状态
    确认服务已正确加载:

    bash

    sudo systemctl status harbor.service
    

    输出应显示 Loaded: loaded (/etc/systemd/system/harbor.service; enabled; ...),其中 enabled 表示已启用自启。

  2. 手动测试启动 / 停止
    测试服务是否能正常工作:

    bash

    # 启动 Harbor
    sudo systemctl start harbor.service
    
    # 查看容器状态(确认 Harbor 相关容器已启动)
    sudo docker ps | grep harbor
    
    # 停止 Harbor(可选,仅测试用)
    sudo systemctl stop harbor.service
    

步骤 4:确保 Docker 服务已开机自启

Harbor 依赖 Docker 服务,若 Docker 未设置自启,需先启用:

bash

# 启用 Docker 开机自启
sudo systemctl enable docker

# 启动 Docker(若当前未启动)
sudo systemctl start docker

验证开机自启(可选)

重启系统后,检查 Harbor 容器是否自动启动:

bash

# 重启系统
sudo reboot

# 重启后登录,查看容器状态
sudo docker ps | grep harbor

若能看到 harbor-nginxharbor-coreregistry 等容器处于 Up 状态,说明开机自启配置成功。

shitou@shitou:~/harbor$ sudo systemctl enable harbor.service Failed to enable unit: "#" is not a valid unit name.

1. 检查并修正 harbor.service 文件

打开服务文件,确保内容无语法错误(特别是没有多余的 # 或特殊字符):

bash

sudo vim /etc/systemd/system/harbor.service

正确的服务文件内容(请严格对照,删除任何多余字符):

ini

[Unit]
Description=Harbor Container Registry
After=docker.service
Requires=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/home/shitou/harbor
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
Restart=on-failure

[Install]
WantedBy=multi-user.target

  • 确保没有多余的 #(注释行除外,且注释行必须以 # 开头);

  • 区块 [Unit][Service][Install] 必须正确闭合,无拼写错误;

  • 路径(如 WorkingDirectoryExecStart)中的目录和命令必须存在(可通过 which docker 确认 docker 路径)。

2. 检查文件是否有特殊字符

有时复制粘贴会引入不可见的特殊字符(如 ^M),导致 systemd 解析失败:

bash

# 查看文件是否有特殊字符(正常应无乱码)
cat -v /etc/systemd/system/harbor.service

  • 若看到 ^M 等字符,需删除:在 vim 中执行 :set fileformat=unix 并保存(wq)。

3. 重新加载 systemd 配置

bash

sudo systemctl daemon-reload

4. 再次尝试启用服务

bash

sudo systemctl enable harbor.service

  • 若成功,会提示 Created symlink ...

  • 若仍报错,检查服务文件名是否正确(必须是 harbor.service,无空格或特殊字符)。

补充:手动创建服务文件(避免格式错误)

如果上述步骤仍失败,可直接用以下命令重新创建服务文件(确保内容纯净):

bash

# 先删除旧文件
sudo rm -f /etc/systemd/system/harbor.service

# 重新创建并写入内容
sudo tee /etc/systemd/system/harbor.service <<-'EOF'
[Unit]
Description=Harbor Container Registry
After=docker.service
Requires=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/home/shitou/harbor
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF