首页 > 解决方案 > Docker 容器运行并立即退出

问题描述

我一直在尝试制作一个 dockerfile 来创建一个可以服务器 html 和 php 页面的网络服务器。

我需要构建图像,当它运行时它会在启动时执行一个 shell 脚本。

我一直在尝试使用 ENTRYPOINT 执行此操作,但我发现容器运行但随后立即退出。

我需要在 dockerfile 中对此进行编码,因为该映像是使用容器优化操作系统直接从 GCP 在 VM 上运行的,它在 VM 启动时运行 docker 映像(所以我没有使用 docker run 的选项 - C)。

这是我目前的尝试。

FROM php:7.2-apache
COPY / /var/www/html/
EXPOSE 80

ADD start_container.sh /usr/bin/start_container
RUN chmod +x /usr/bin/start_container

ENTRYPOINT ["start_container"]

我也试过这个

ENTRYPOINT ["docker-php-entrypoint && start_container"]; sleep infinity

CMD ["docker-php-entrypoint"]

目前 bash 脚本只是创建一个 html 文件。

#! /usr/bin/env bash

cat>/var/www/html/indextest.html

标签: dockerdockerfile

解决方案


您不需要覆盖CMDentrypoint作为基础映像从启动 appacheCMD,这就是为什么您的容器在执行仅创建 index.html 的 bash 脚本后立即死亡的原因。容器的生命周期就是入口点的生命周期,因此入口点应该运行一个长时间运行的进程来保持它们运行。

#!/usr/bin/env bash

echo "hello world" > /var/www/html/indextest.html

在上述情况下,容器将在创建index.html.

您的情况的解决方法

#!/usr/bin/env bash
echo "hello" > /var/www/html/index.html
exec apache2-foreground

Dockerfile

FROM php:7.2-apache
EXPOSE 80
ADD start_container.sh /usr/bin/start_container
RUN chmod +x /usr/bin/start_container
ENTRYPOINT ["start_container"]

然后

docker build -t test . && docker run -dit -p 8090:80 --rm abc && sleep 2 &&  curl localhost:8090

您将从终端的容器中看到 hello world。

但最好把它放在index.htmldocker build time 上,然后你就不需要覆盖入口点或 CMD。

FROM php:7.2-apache
RUN echo "hello world" > /var/www/html/index.html
EXPOSE 80

推荐阅读