[英]Docker exits container
我正在尝试为 apache2 和 PHP 构建自己的 docker 映像。 谁能告诉我为什么我的容器在运行 ["apache2ctl", "-D", "FOREGROUND"] 时会在运行后退出?
FROM ubuntu:latest
RUN apt update -y && apt upgrade -y
RUN apt install software-properties-common -y
RUN add-apt-repository ppa:ondrej/php -y
RUN apt update -y && apt upgrade -y
ARG DEBIAN_FRONTEND=noninteractive
RUN DEBIAN_FRONTEND=noninteractive apt install -y nano vim iputils-ping sudo git curl php php-cli php-fpm
RUN apt install -y php-json php-mysql
RUN apt install -y php-zip php-mbstring php-curl php-xml php-pear php-bcmath
RUN apt install psmisc -y
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOF_DIR /var/log/apache2
# RUN useradd -ms /bin/bash devwl
EXPOSE 80/tcp
ENTRYPOINT ["/bin/sh", "-c"]
CMD ["apache2ctl", "-D", "FOREGROUND"]
构建命令:
docker build -t www .
运行命令:
docker run -itd -p 80:80 www
刚刚尝试构建您的 Dockerfile。 docker logs
显示启动命令有问题。 运行没有-D
选项的容器效果很好......
CMD ["apache2ctl", "start"]
您需要在 conf 文件中使用 <IfDefine ...> 吗?
您需要删除ENTRYPOINT
行。
由于您同时拥有一个ENTRYPOINT
和一个CMD
,它们被组合成一个单独的参数列表。 这意味着你有一个有效的命令,比如
ENTRYPOINT+CMD ["/bin/sh", "-c", "apache2ctl", "-D", "FOREGROUND"]
但是sh -c
只读取单个 next 参数并执行它。 其余参数可以在该字符串中作为位置参数$0
, $1
,...访问,但除非您引用其中一个,否则您最终运行的命令只是没有参数的apachectl
。
如果您的命令使用 shell 功能(引用环境变量或运行多个命令),您只需要调用 shell。 你的没有,所以你不需要任何提到外壳的东西; 只需删除ENTRYPOINT
并让现有的CMD
启动 Apache。
在 Dockerfile 中,您通常根本不需要说sh -c
。 如果确实需要调用 shell 来运行某些命令,则可以使用Docker shell 语法作为纯字符串,而无需 JSON-array 语法; 例如
# needs a shell because of $VARIABLE and command; command syntax
CMD touch "$APACHE_LOG_DIR/started"; exec apache2ctl -DFOREGROUND
(如果您确实需要使用docker run
参数或在 Compose command:
中覆盖此命令,这些语法将不会自动插入外壳包装器,如果您需要外壳,您确实需要明确地说sh -c 'some command'
处理命令字符串;再次注意单引号以使命令字符串成为单个参数。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.