“systemctl”命令在带有Docker的centos上不起作用

qf9go6mv  于 2022-12-18  发布在  Docker
关注(0)|答案(1)|浏览(443)

我使用docker与centos 8.我怎么能使用systemctl命令在dockerfile请?当我安装一个应用程序,它需要systemctl.我有一个错误:
系统尚未使用systemd作为init系统(PID 1)启动。无法操作。无法连接到总线:主机已关闭
我这样构建Docker:

docker build -t myapp:11 .

当我在容器中尝试时也是如此:

docker run -it --privileged app:11 /bin/bash

谢谢。

Docker构建-t细微差别:11。

docker运行-it --cap-add=NET_ADMIN细微差别:11 /bin/bash

# syntax=docker/dockerfile:1
FROM centos:latest
USER root

RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

RUN yum -y update && \
    yum clean all
    
RUN yum -y install \
    java-11-openjdk-devel \
    perl-Data-Dumper \
    redhat-lsb-core.x86_64 \
    glibc.x86_64 \
    glibc.i686 \
    libstdc++.x86_64 \
    libstdc++.i686 \
    openssl \
    libgcc \
    libgcc.i686 \
    libaio.x86_64 \
    libaio.i686 \
    libnsl.i686 \
    ncurses-libs \
    httpd.x86_64 \
    unzip \
    -x postfix \
    -x mariadb-libs \
    zlib.i686 \
    zlib.x86_64

WORKDIR /tmp

COPY Nuance_Speech_Suite-11.0.10-x86_64-linux.tgz ./Nuance_Speech_Suite-11.0.10-x86_64-linux.tgz
COPY NRec-fr-FR-10.0.0-10.1.0.i686-linux.tar.gz ./languages/NRec-fr-FR-10.0.0-10.1.0.i686-linux.tar.gz
COPY NVE_fr_FR_audrey-ml_xpremium-2.1.0_linux.zip ./languages/NVE_fr_FR_audrey-ml_xpremium-2.1.0_linux.zip
COPY NRec-fr-FR-10.0.0-10.1.0-CumulativePatch-1_linux.zip ./languages/NRec-fr-FR-10.0.0-10.1.0-CumulativePatch-1_linux.zip
COPY NRec-fr-FR-10.0.0-10.1.0-CumulativePatch-2_linux.zip ./languages/NRec-fr-FR-10.0.0-10.1.0-CumulativePatch-2_linux.zip
COPY nuance.lic ./nuance.lic

RUN tar -zxf Nuance_Speech_Suite-11.0.10-x86_64-linux.tgz
RUN tar -zxf languages/NRec-fr-FR-10.0.0-10.1.0.i686-linux.tar.gz
RUN unzip languages/NVE_fr_FR_audrey-ml_xpremium-2.1.0_linux.zip
RUN unzip languages/NRec-fr-FR-10.0.0-10.1.0-CumulativePatch-1_linux.zip
RUN unzip languages/NRec-fr-FR-10.0.0-10.1.0-CumulativePatch-2_linux.zip

WORKDIR /tmp/Nuance_Speech_Suite-11.0.10

RUN ./setup.sh -s -f "/tmp/nuance.lic" -j "/usr/lib/jvm/java-11-openjdk" -V "/tmp/languages" -I "NLM,NSS"

测井曲线末行
2022-12-16 09:22:11 setup.sh:信息:重新启动Nuance许可证管理器服务2022-12-16 09:22:11 setup.sh:信息:启动命令“systemctl重新启动nuance-licmgr”;发送到日志的输出系统尚未使用systemd作为init系统(PID 1)启动。无法操作。无法连接到总线:主机停机2022-12-16 09:22:11 setup.sh:信息:命令“systemctl重新启动细微差别-licmgr”返回1 2022年12月16日09:22:11 setup.sh:错误:安装后处理nlm启动服务()无法启动服务2022年12月16日09:22:11 setup.sh:信息:由于之前的后处理错误,跳过install_postprocessing_nms()的调用2022-12-16 09:22:11 setup.sh:信息:由于以前的错误,正在跳过install_execute_installsuite

vmjh9lq9

vmjh9lq91#

你根本不能在Docker文件中运行systemctl,更广泛地说,像systemctlservice这样的命令在Docker中不能很好地工作,你应该重新构造你的容器来避免它们。
对于systemctl,更具体地说,它尝试连接到systemd守护进程。在Dockerfile中,每个RUN步骤都发生在一个新容器中,并且像其他容器一样,该容器 * 仅 * 运行一个RUN命令;它不运行systemd或任何其他典型的Linux守护进程。此外,在RUN行的末尾,文件系统是持久的,但任何其他更改都将丢失,因此即使您成功地执行了systemctl start,映像也不会包含正在运行的进程。
更一般地说,我建议在Docker中避免使用systemd,像tini这样的最小的init系统对于一些问题来说是个好主意,比如收获僵尸进程;如果您必须在一个容器中运行多个进程,并且确实不能重构它,那么supervisord可以满足您的需求。典型的systemd安装需要配置内核参数、启动终端登录、挂载文件系统和配置网络,所有这些在Docker中基本上都是不可能的;它将捕获主进程的stdout,因此docker logs不工作。
让你的容器只有一个进程。如果你不需要的话,不要运行init系统。不要试图“启动一个服务”,只要在前台运行你试图构建的程序,就像容器做的一样。

FROM some-base-image
RUN a command to install the software
CMD the_program
# with no `systemctl` anywhere

相关问题