解决 System has not been booted with systemd as init system (PID 1). Can‘t operate.

docker 容器使用systemctl

以ubuntu做为参考。

拉取容器

  • 直接拉取

    使用 docker pull ubuntu 直接拉取。

  • 通过Dockerfile拉取

    Dockerfile:

    # 基础镜像
    FROM ubuntu:18.04
    
    # build参数
    ARG user=duapple
    
    # 元数据
    LABEL maintainer="hejiang" email="2832893880@qq.com"
    
    # 安装依赖
    #RUN apt-get update && apt-get install -y sudo 
    
    # 添加用户:赋予sudo权限,指定密码
    RUN useradd --create-home --no-log-init --shell /bin/bash ${user} \
        && adduser ${user} sudo \
        && echo "${user}:123123" | chpasswd
    
    # 改变用户的UID和GID
    #RUN usermod -u 1000 ${user} && usermod -G 1000 ${user}
    
    # 指定容器起来的工作目录
    WORKDIR /home/${user}
    
    # 指定容器起来的登录用户
    USER {user}
    

    拉取:

    $ docker build -t ubuntu1804:test .
    

请添加图片描述

如果不具备上网能力,可以先不安装sudo,在进入系统后,设置好软件源以后再安装sudo。

# 配置容器

这里以docker拉取的镜像为例子。直接拉取镜像的方式,需要手动创建非root用户,其余操作与下文保持一直。
无Dockerfile的情况,新建用户脚本,执行前需要先安装sudo
add_user.sh:

#!/bin/bash

user=$1

echo "add user: ${user}"

useradd -d /home/${user} -m ${user}
passwd ${user}

usermod -g ${user} -G root ${user}

chmod u+w /etc/sudoers
echo "${user} ALL=(ALL:ALL) ALL" >> /etc/sudoers

chmod u-w /etc/sudoers

usermod -s /bin/bash ${user}
# add_user.sh duapple

注意:需要使用systemctl,就不能用非root用户启动容器,否则尽管设置了/sbin/init作为第一个进程启动,systemctl还是不能使用。(另外,为什么创建容器不直接指定运行/sbin/init?因为安装的容器可能内部并没有安装systemd,比如我用的ubuntu容器,内部就没有安装systemd,也就没有/sbin/init,这会导致启动容器失败。因此需要先进入容器,安装好systemd,在对配置进行修改。)

创建容器并运行。注意:需要设置 --privileged参数,确保能获取到真正的root权限。

$ docker run --privileged -itd --name ubuntu_test -u root ubuntu1804:test /bin/bash
$ docker exec -it ubuntu_test /bin/bash

请添加图片描述

修改root密码并安装sudo。

# passwd 
# apt update
# apt install sudo 

切换到duapple用户。测试sudo,并安装systemd。

# exit
$ docker exec -it -u duapple ubuntu_test /bin/bash
$ sudo apt install systemd
$ ls -al /sbin/init

请添加图片描述

下载ssh,进行测试。

$ sudo apt install ssh
$ sudo systemctl start ssh

此时会报错:

请添加图片描述

配置容器的第一个进程

$ exit
$ docker stop ubuntu_test
$ sudo systemctl stop docker
# sudo su
# 

修改 config.v2.json中的 PathCmd ,由 /bin/bash 设置为 /sbin/init注意:一定要先关闭docker服务,修改配置才能生效。

# vim /var/lib/docker/containers/0f22b0c68de9819eb72d02094a5d23d3ee66e4eabd3563b9190f48ac83c55f22/config.v2.json

请添加图片描述

保存修改后,重启docker,再重启docker容器,重新配置即可。

$ docker start ubuntu_test
$ docker exec -it -u duapple ubuntu_test /bin/bash
$ sudo systemctl start ssh
$ sudo systemctl status ssh

请添加图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值