Docker在运行Docker start命令时不能执行init脚本

时间:2015-04-25 12:19:33

标签: apache tomcat docker centos7

我创建了一个基于CentOS 7的Docker镜像。我希望在执行Docker运行命令时,Docker容器可以自动启动Apache和Tomcat服务。

我的docker start命令是:

sudo docker run --privileged -ti --name apache-tomcat-mobile --rm -v /software:/software -p 81:80 local/web-apache /app/scripts/start-web.sh

但我总是遇到这个错误:

  

exec格式errorFATA [0000]来自守护程序的错误响应:无法启动容器7332a91875c1aefb0d6c5160a69fe1c21058c06673b6e4058c81a8641af53baa:exec格式错误

我的start-web.sh只有两个任务,一个是tomcat startup.sh,另一个是httpd -k start。

我已经为start-web.sh设置了足够的权限。

我执行时

`sudo docker run --privileged -ti --name apache-tomcat-mobile --rm -v / software:/ software -p 81:80 local / web-apache / bin / bash,没有错误发生。

The docker file I used based on CentOS7. The bas docker file is :
FROM centos:7
MAINTAINER "edao99" <jianghy_bj@hotmail.com>
ENV container docker
RUN yum -y swap -- remove fakesystemd -- install systemd systemd-libs
RUN yum -y update; yum clean all;\
(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done);\
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

The actually docker filed used for apache and tomcat is inherited from the base docker. The apache docker file is:
FROM local/c7-systemd
RUN yum -y install gcc; yum clean all;
RUN yum -y install httpd; yum clean all;
RUN yum -y install apr-util-devel; yum clean all;
RUN yum -y install httpd-devel; yum clean all;
RUN yum -y install wget; yum clean all;
RUN yum -y install make; yum clean all;
RUN yum -y install tar; yum clean all;
RUN systemctl enable httpd.service
EXPOSE 80
CMD ["/usr/sbin/init"]

我从互联网上搜索了解决方案,但我没有找到类似的问题。 有人可以帮我解决这个问题吗?

感谢。

1 个答案:

答案 0 :(得分:0)

您需要先将运行的脚本复制到容器中,然后才能将其用作命令。您需要在Dockerfile中添加一行,例如:

COPY start-web.sh /app/scripts/start-web.sh

确保将start-web.sh放在构建上下文中。

此外,如果你摆脱了systemd的东西,你的构建文件会简单得多。如果您必须拥有多个流程,请考虑使用更简单的流程管理工具(如Supervisor或Runit),或者只编写自己的shell脚本来启动服务。