[英]Docker container existing on `docker-compose up` from RUN apache reload
我有一個 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
docker-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:
下面是output是什么
$ 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
注釋掉# service apache2 reload
行,然后從構建的容器中運行 reload 命令,一切看起來都正常。
如何在不退出的情況下從 Dockerfile 重新加載 apache?
您可以安全地從 Dockerfile 中刪除該行。
一個 Docker 圖像只包含一個文件系統和一些相關的元數據。 它不包含任何正在運行的進程; 沒有“服務”,也沒有什么可以從 Dockerfile 的上下文中“重新啟動”。
一個容器通常只運行一個進程。 在大多數情況下,您會使用CMD
指令指定這是什么,它會作為前台進程運行一些單個命令。 service
或systemctl
之類的命令在 Docker 中大多根本不起作用,也不是必需的:如果需要重新啟動主容器進程,只需刪除並重新創建容器即可。 在php:...-apache
Docker Hub 圖像的特定情況下,這是在基本圖像Dockerfile
中提供的; 所以當你docker run
圖像時,它會在一個干凈的環境中啟動一個新的 Apache 服務器。
請將RUN service apache2 reload
CMD service apache2 restart
您不得在鏡像構建中運行服務,它們必須在容器啟動時運行。 CMD在用戶啟動容器時執行。 如果您在構建時使用 RUN 服務,那么它會卡住或失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.