首页 > 解决方案 > 容器启动后Docker CMD命令未运行,而进入容器的命令工作正常

问题描述

这是我的Dockerfile内容:

from ubuntu:latest

#ARG DEBIAN_FRONTEND=noninteractive
COPY entrypoint.sh /sbin/entrypoint.sh
COPY info.php /var/www/html/
ENV TZ=Asia/Tehran
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get update && apt-get upgrade -y && apt-get install apache2 php -y
ENV APACHE_CONF_DIR=/etc/apache2
RUN chmod 755 /sbin/entrypoint.sh
CMD ['/sbin/entrypoint.sh']

这是我的entrypoint.sh内容:

#!/bin/bash

source /etc/apache2/envvars
exec apache2 -D FOREGROUND

图像可以正常运行,没有任何问题,它也可以正常启动,但文件entrypoint.sh没有启动。当我exec -it进入容器并手动运行此文件时,apache2工作正常并且我info.php可以通过网络访问。

我使用此命令创建容器(使其运行):

docker run -dp80:80 -v /logs:/var/log a2 bash

然后我去容器docker exec -it NAME,然后运行/sbin/entrypoint.sh,我发现没有问题。

我创建了另一个容器docker run -dp81:80 a2,但我的文件没有运行。当我使用docker run -dp81:80 a2 /sbin/entrypoint.sh时,我的文件会运行并且我info.php的会显示在 Internet 浏览器中。

请您帮我看看我的问题在哪里?在命令末尾不使用我的文件名,容器在启动后会立即退出吗?

标签: docker

解决方案


编辑

CMD 文档中,当使用 exec 格式(在 中指定 args [])时,您需要使用双引号"而不是单引号',因为 args 被解析为 JSON 数组。我认为您应该将命令更改为:

CMD [ "/sbin/entrypoint.sh" ]

有关更多信息,请参阅比较 CMD 与 ENTRYPOINT 的答案

CMD当您指定启动容器时要运行的命令时,您会覆盖容器。一个示例是bash在图像名称之后放置:docker run -d -p 80:80 -v /logs:/var/log a2 bash. 它不是运行/sbin/entrypoint.sh脚本,而是运行bash.

如果要确保入口点脚本在容器启动时运行并且不能被覆盖,则可以考虑使用ENTRYPOINT 。CMD

ENTRYPOINT ["/sbin/entrypoint.sh"]

正如 David Maze 在评论中指出的那样,您还可以修改入口点脚本以仅设置环境变量并CMD exec "$@"在 Dockerfile 中使用以将 apache 作为主容器进程运行。


推荐阅读