我对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
但是当我尝试在主机中运行它时,它失败了。帮助吗?
答案 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