基于docker官方Ubuntu镜像build和使用systemd的一些常见问题

由于用惯了CentOS且Ubuntu用得少,特记录一下创建Ubuntu镜像遇到的一些问题。

​apt依赖的问题

  1. The following packages have unmet dependencies: apt-utils : Depends: apt (= 2.0.9) but 2.4.8 is to be installed E: Unable to correct problems, you have held broken packages.

解决:指定depends需要的版本(括号内的版本全名). 注意:这里只是指定安装版本的方式,实际上会遇到接下来的错误2.

 # 指定版本
  apt-get install --reinstall apt=2.0.9 -y



  1. E: Packages were downgraded and -y was used without --allow-downgrades.

如果遇到上面错误1就直接指定版本安装,并不会顺利通过,而是会遇到这个错误2。去掉-y行不行呢?不行,build过程会因为遇到Do you want to continue? [Y/n] Abort.,没有手动确认继续则会中断,build需要全部自动完成。所以既要指定安装版本,又要避免downgrade安装的手动确认,处理办法是使用管道预输入y:

  #指定版本,同时避免downgrade错误、需要手动输入确认安装 两个问题
  echo y| apt-get install --reinstall apt=2.0.9



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

这种情况是没有在启动时将systemd作为init系统启动,init是linux系统的老式服务管理模块,要使用systemd需要init。 安装init和systemd后,docker启动时按 docker run -d *** image-name /usr/sbin/init启动即可。



4.Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: stat /usr/sbin/init: no such file or directory: unknown.

这里报错是多段,应从最末端排查(这里的问题是没有apt-get安装init包). 然后再排查RunC等问题。



如果确实需要在Ubuntu使用systemd而镜像没有自带,Dockerfile增加如下RUN部分即可:

RUN echo y|apt-get install --reinstall libsystemd0=245.4-4ubuntu3.19 \
    && apt-get install --reinstall systemd -y \
    && apt-get install init -y
## 运行容器时以 docker run -d *** image-name /usr/sbin/init 格式启动



Tips: 自带systemd的Ubuntu镜像:
https://hub.docker.com/r/jrei/systemd-ubuntu

Dockerfile示例如下

因为镜像自带源搜不到ca-certificate包,所以国内源sources.list使用了http的链接。(当然也可以安装离线包或先安装curl解决)

# A nginx image for study & dev
# 本镜像启动时需要映射一个目录到/data供读配置、写日志
# nginx默认启动用户为 www:www(uid:3999,gid:399)(如果宿主机需要对映射目录有相同权限,可建立同id用户)
FROM ubuntu:latest
LABEL authors="Charles@local.dev" website="www.local.dev"

USER root
# WORKDIR /var/tmp/
# RUN apt-get install curl -y \
#     && curl -O http://archive.ubuntu.com/ubuntu/pool/main/c/ca-certificates/ca-certificates_20211016ubuntu0.20.04.1_all.deb \
#     && sudo dpkg -i ca-certificates_20211016ubuntu0.20.04.1_all.deb

ENV DEBIAN_FRONTEND noninteractive

COPY ./sources.list /etc/apt/
COPY ./nginx.service /usr/lib/systemd/system/

RUN apt-get update \
    && apt-get upgrade

RUN echo y|apt-get install --reinstall apt=2.0.9 \
    && apt-get install apt-utils -y \
    && apt-get install apt-transport-https -y \
    && apt-get install ca-certificates -y \
    && apt-get install net-tools networkd-dispatcher -y

RUN apt-get install dbus -y \
    && echo y|apt-get install --reinstall libsystemd0=245.4-4ubuntu3.20 \
    && apt-get install --reinstall systemd -y \
    && apt-get install init -y

RUN apt-get install vim -y \
    && apt-get install tree -y \
    && apt-get install curl -y \
    && apt-get install nginx -y


# 启动容器需要使用目录映射,需要基本的预设目录树如下, 并保证用户www有对应权限(d0755 & f0644)
# /data
# /data/etc/nginx  
# /data/etc/certs  
# /data/var/log/nginx 
RUN groupadd www -g 399 \
    && useradd www -u 3999 -g 399 \
    && systemctl enable nginx.service \
    && mv /etc/nginx /etc/nginx.bak \
    && ln -s /data/etc/nginx /etc/nginx \
    && ln -s /data/var/log/nginx /var/log/nginx

EXPOSE 80/tcp 443/tcp
VOLUME ["/data"]
ENTRYPOINT [ "/bin/bash" ]
CMD [ "-c", "tail -f /dev/null" ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值