Ubuntu Docker容器立即停止,与Dockerfile有关?

时间:2019-04-04 13:38:34

标签: linux docker containers dockerfile

我对Docker还是很陌生,对于为什么我的容器在启动时退出的原因完全困惑。

我建立了一个Ubuntu映像,该映像在启动时启动Apache和fail2ban。我不确定Dockerfile是问题还是我正在运行的启动容器的命令。

我尝试过:

docker run -d -p 127.0.0.1:80:80 image
docker run -d -ti -p 127.0.0.1:80:80 image
docker run -d -ti -p 127.0.0.1:80:80 image /bin/bash

Dockerfile如下:

FROM ubuntu:latest

RUN \
  apt-get update && \
  apt-get -y upgrade && \
  apt-get install -y build-essential && \
  apt-get install -y iptables && \
  apt-get install -y software-properties-common && \
  apt-get install -y apache2 fail2ban && \
  rm -rf /etc/fail2ban/jail.conf

ADD index.html /var/www/html/
ADD jail.conf /etc/fail2ban/

ENV  HOME /root
WORKDIR /root

EXPOSE 80 443

ENTRYPOINT service apache2 start && service fail2ban start
CMD ["bash"]

我可以使用以下方法跳入容器本身:

docker exec -it image /bin/bash

但是当我尝试在主机中运行它时,它失败了。帮助吗?

2 个答案:

答案 0 :(得分:2)

考虑到您的问题,当您提到“启动时”时,我认为阅读https://docs.docker.com/config/containers/multi-service_container/会很有用。

简而言之,码头工人容器不会作为普通系统“启动”,它们会启动一个过程并执行该过程,直到退出为止。

因此,如果要启动两个进程,则可以按照上面的链接中的说明执行包装脚本。

答案 1 :(得分:1)

从Dockerfile中删除以下行:

CMD ["bash"]

此外,当您想将外壳放入容器时,必须覆盖Dockerfile的ENTRYPOINT定义:

docker exec -it --entrypoint "/bin/bash" image

有关更多详细信息,请参见Dockerfile "ENTRYPOINT" documentation