docker - 容器启动后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 浏览器中。
请您帮我看看我的问题在哪里?在命令末尾不使用我的文件名,容器在启动后会立即退出吗?
解决方案
编辑
从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 作为主容器进程运行。
推荐阅读
- javascript - ajax 后 DOM 更改后重新初始化 Vue.js 组件
- azure - Azure Function 项目结构(C# 与 CSX)和最佳实践
- javascript - nvd3 折线图,x 轴上的数据多于 y 轴上的数据
- python - 无法使用 Python 创建虚拟环境
- sql - 在 SQL 查询中使用 where - 或条件在许多表中左连接
- angular - Angular 2+ - 如何将变量传递给 SASS :before / :after 伪选择器
- c# - 如何在 URL asp.net /aspx 中允许点、下划线?
- unity3d - 具有不同元数据的相同图像目标是否适用于云识别 (Vuforia)?
- .htaccess - htaccess 中的强制 SSL 仅转到主页
- javascript - 在 IE8 上使用 Vivid.JS 库