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