我正在尝试将AEM 6.0安装停靠,这是我作者的Docker文件。
from centos:latest
COPY aem6.0-author-p4502.jar /AEM/aem/author/aem6.0-author-p4502.jar
COPY license.properties /AEM/aem/author/license.properties
RUN yum install dnsmasq -y
RUN systemctl enable dnsmasq
RUN yum install initscripts -y
RUN (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/*;
WORKDIR /AEM/aem/author
RUN yum install wget -y
RUN wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u151-b12/e758a0de34e24606bca991d704f6dcbf/jdk-8u151-linux-x64.rpm"
RUN yum localinstall jdk-8u151-linux-x64.rpm -y
RUN java -XX:MaxPermSize=256m -Xmx512M -jar aem6.0-author-p4502.jar -unpack
COPY aem6 /etc/init.d/aem6
RUN chkconfig --add aem6
RUN yum -y install initscripts && yum update -y & yum clean all
RUN chown -R $USER:$(id -G) /etc/init.d
RUN chmod 777 -R /etc/init.d/aem6
RUN systemctl enable aem6.service
RUN service aem6 start
VOLUME /sys/fs/cgroup
CMD /usr/sbin/init
启动服务时构建失败,错误为failed to get Dbus connection error
。我一直无法弄清楚如何解决它。
我试过这些 - https://github.com/CentOS/sig-cloud-instance-images/issues/45 - https://hub.docker.com/_/centos/
答案 0 :(得分:0)
在这里,问题是您正试图在“构建”阶段启动aem
服务,并使用以下声明:
RUN service aem6 start
由于多种原因,这是有问题的。首先,你正在构建一个图像。在此阶段启动服务毫无意义......当构建过程完成时,没有正在运行。图像只是文件的集合。在您启动容器之前,您没有任何进程,此时CMD
和ENTRYPOINT
会影响正在运行的内容。
另一个问题是,在此阶段,容器环境中没有其他任何东西在运行。在这种情况下,service
命令尝试使用systemd
api与dbus
进行通信,但这些服务都没有运行。
还有第三个稍微微妙的问题:您选择的解决方案依赖于systemd
,标准的CentOS流程管理器,并且就事情而言,您已经正确配置了事情(通过启用服务使用systemctl enable ...
并在/sbin/init
语句中启动CMD
。但是,尽管有可能,但在容器中运行systemd可能会很棘手。过去,systemd
要求容器以--privileged
标志运行;我不确定这是否还有必要。
如果您没有在容器内运行多个进程(dnsmasq和aem),最简单的解决方案是直接启动aem
服务,而不是依赖于进程管理器。这会将Dockerfile减少为:
FROM centos:latest
COPY aem6.0-author-p4502.jar /AEM/aem/author/aem6.0-author-p4502.jar
COPY license.properties /AEM/aem/author/license.properties
WORKDIR /AEM/aem/author
RUN yum install wget -y
RUN wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u151-b12/e758a0de34e24606bca991d704f6dcbf/jdk-8u151-linux-x64.rpm"
RUN yum localinstall jdk-8u151-linux-x64.rpm -y
RUN java -XX:MaxPermSize=256m -Xmx512M -jar aem6.0-author-p4502.jar -unpack
CMD some commandline to start aem
如果您确实需要dnsmasq,则可以在第二个容器中运行它(可能与aem容器共享相同的网络环境)。