首页 > 解决方案 > 来自 RUN apache reload 的 docker-compose up 上存在的 Docker 容器

问题描述

我有一个 docker-compose.yml 和一个 Dockerfile,但是docker-compose up当它到达service apache2 reload.

Dockerfile

# Base image
FROM php:7.2.1-apache

# Run apt update and install some dependancies needed for docker-php-ext
RUN apt update && apt install -y libpng-dev libicu-dev zip unzip libxml2-dev sendmail

# Install PHP extensions
RUN docker-php-ext-install mysqli gd intl zip xmlrpc soap opcache

# Reload apache
RUN service apache2 reload

码头工人-compose.yml

version: "3"
services:
    web:
        build: ./docker/php-apache
        # image: moodle:php:7.2.1-apache
        # volumes:
        #   - ./public_html:/var/www/html
        ports:
          - "8080:80"
        links:
            - "mariadb"

    mariadb:
        image: mariadb:10.2.33
        volumes:
            - mariadb:/var/lib/mysql
        environment:
            TZ: "Europe/Rome"
            MYSQL_ALLOW_EMPTY_PASSWORD: "no"
            MYSQL_ROOT_PASSWORD: "rootpwd"
            MYSQL_USER: "moodle"
            MYSQL_PASSWORD: "moodle"
            MYSQL_DATABASE: "moodle"

volumes:
    mariadb:

下面是输出

$ docker-compose up
...
Step 5/5 : RUN service apache2 reload
Reloading Apache httpd web server: apache2 failed!
ERROR: Service 'web' failed to build: The command '/bin/sh -c service apache2 reload' returned a non-zero code: 1

看到我的容器已退出并停止。

但是,如果我在注释掉docker-compose up的行的情况下运行,然后从构建的容器中运行 reload 命令,一切看起来都很好。# service apache2 reload

如何在不退出的情况下从 Dockerfile 重新加载 apache?

标签: dockerdocker-compose

解决方案


您可以安全地从 Dockerfile 中删除该行。

一个 Docker 镜像只包含一个文件系统和一些相关的元数据。它不包含任何正在运行的进程;没有“服务”,也没有任何东西可以从 Dockerfile 的上下文中“重新启动”。

一个容器通常只运行一个进程。在大多数情况下,您会使用指令指定这是什么CMD,并且它将运行一些单个命令作为前台进程。类似servicesystemctl大多数命令在 Docker 中根本不起作用,也不是必需的:如果您需要重新启动主容器进程,您只需删除并重新创建容器。在php:...-apache Docker Hub 镜像的特定情况下,这在基础镜像中提供Dockerfile;所以当你docker run镜像时,它会在一个干净的环境中启动一个新的 Apache 服务器。


推荐阅读