我试图用 php8 和 apache 构建一个 docker img,但是当在 RUN service apache2 restart 行中重新启动 apache 时,返回此错误,这是 dockerfile:
FROM webdevops/php-apache:8.2
# we need libaio!
RUN apt-get update
RUN apt-get install -y libaio1 libaio-dev
ADD instantclient-basic-linux.x64-12.2.0.1.0.zip /tmp/
ADD instantclient-sdk-linux.x64-12.2.0.1.0.zip /tmp/
ADD instantclient-sqlplus-linux.x64-12.2.0.1.0.zip /tmp/
RUN unzip /tmp/instantclient-basic-linux.x64-12.2.0.1.0.zip -d /usr/local/
RUN unzip /tmp/instantclient-sdk-linux.x64-12.2.0.1.0.zip -d /usr/local/
RUN unzip /tmp/instantclient-sqlplus-linux.x64-12.2.0.1.0.zip -d /usr/local/
RUN ln -s /usr/local/instantclient_12_2 /usr/local/instantclient
RUN ln -s /usr/local/instantclient/libclntsh.so.12.1 /usr/local/instantclient/libclntsh.so
RUN ln -s /usr/local/instantclient/sqlplus /usr/bin/sqlplus
ENV LD_LIBRARY_PATH /usr/local/instantclient_12_2/
# install
RUN echo 'instantclient,/usr/local/instantclient' | pecl install oci8
RUN echo "extension=oci8" > $(pecl config-get ext_dir)/oci8.ini
# don't know if this is necessary
RUN docker-php-ext-enable oci8
# RUN ldd /usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so
# RUN ldconfig
#restart apache
RUN service apache2 restart
#show if oci8 is present
RUN php -i | grep oci8
# export ports
EXPOSE 80 443
谢谢!!
解决问题并构建docker
在评论中,您引用这一行作为问题:
RUN service apache2 restart
您可以安全地删除此行。
Docker 镜像不包含任何正在运行的进程。 相反,它包含图像的文件系统和一些描述容器启动时要执行的操作的元数据。 如果您更改 Dockerfile 中的配置文件,则无需重新启动服务:它现在尚未运行,当您最终从映像中
docker run
容器时,它将首次启动其进程,并且这将读取配置文件。
由于容器仅运行单个进程,因此它通常不会运行任何类型的进程管理器,因此
service
、systemctl
和类似的命令通常不起作用。 您的图像似乎有一个设置,其中 service
尝试与主管交互,但同样,它在图像构建期间没有运行,因此 RUN service ...
失败并出现您显示的错误。 您通常不需要在 Docker 上下文中运行 service
,而且它通常不会工作。