在我的前篇博文(用Podman从零开始构建并运行一个Apache+PHP的容器镜像 (一))里记录了我在不依赖像Docker Hub这样的镜像源的情况下粗略的搭建了一个php+apache的服务器Podman容器。但是那确实还是有点粗糙,今天我想尝试在这个基础上进一步完善它。
首先,现在的这个容器的Apache服务不会自动启动,需要启动容器后再手工启动容器,这显然太不方便了。现在先解决这个自动启动Apache服务的问题。
熟悉Ubuntu的朋友应该都知道,再Ubuntu下启动Apache服务器其实只要使用service命令就可以了的。先进入运行容器试试:
C:\Users\arthur>podman run --rm -p8080:80 -it localhost/php_apache:7.4 /bin/bash
root@2f001f233a91:/# service apache2 start
* Starting Apache httpd web server apache2
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 10.88.0.17. Set the 'ServerName' directive globally to suppress this message *
貌似可以的。为了确认,用ps命令看看有没有apache2的进程在运行:
root@2f001f233a91:/# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.0 10300 3936 pts/0 Ss 22:46 0:00 /bin/bash
root 30 0.3 0.5 193460 19908 ? Ss 22:46 0:00 /usr/sbin/apache2 -k start
www-data 33 0.0 0.2 193484 8300 ? S 22:46 0:00 /usr/sbin/apache2 -k start
www-data 34 0.0 0.2 193484 8300 ? S 22:46 0:00 /usr/sbin/apache2 -k start
www-data 35 0.0 0.2 193484 8300 ? S 22:46 0:00 /usr/sbin/apache2 -k start
www-data 36 0.0 0.2 193484 8300 ? S 22:46 0:00 /usr/sbin/apache2 -k start
www-data 37 0.0 0.2 193484 8300 ? S 22:46 0:00 /usr/sbin/apache2 -k start
root 40 0.0 0.0 11968 3376 pts/0 R+ 22:46 0:00 ps aux
很明显,我看到了5个apache2的进程在后台运行。在浏览器上也是可以正常访问http://localhost:8080/的。说明成功了,那么现在只要在Containerfile文件中把service apache2 start
命令加到ENTRYPOINT中应该就可以了:
FROM localhost/ubuntu:20.04
#为了节省篇幅,这中间的代码省略了。需要的朋友请看我的前一篇博文....
EXPOSE 80
ENTRYPOINT ["service", "apache2", "start"]
接着就是重新build,过程就不记录在这里了。
马上运行容器看看:
E:\containers\php_apache>podman run --rm -p8080:80 -it localhost/php_apache:7.4 /bin/bash
* Starting Apache httpd web server apache2
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 10.88.0.18. Set the 'ServerName' directive globally to suppress this message
*
奇怪!虽然看到启动Apache服务的提示,但是没有进入bash,而是直接退出了。在浏览器上也访问不了http://localhost:8080。
一阵搜索后,感觉要专门写一个entrypoint脚本才能脚本才行。那么就试试吧,在Containerfile所在的文件夹下创建一个名为entrypoint.sh的脚步文件,内容如下:
#!/bin/bash
service apache2 start
exec "$@"
*这里有一个坑,我是在windows下编辑这个文件的,结果容器运行时出错了。后来查了好久才发现是文件的换行符问题,这个文件的换行符一定要是LF,否则不行!
再给修改Containerfile文件:
FROM localhost/ubuntu:20.04
# 这里有省略的内容...
COPY entrypoint.sh /usr/local/bin
RUN chmod 755 /usr/local/bin/entrypoint.sh
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
EXPOSE 80
CMD ["/bin/bash"]
重新build后,再次尝试运行(这里我没有在命令后面加/bin/bash
,因为在Containerfile里已经通过CMD参数指定了):
E:\containers\php_apache>podman run --rm -p8080:80 -it localhost/php_apache:7.4
* Starting Apache httpd web server apache2
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 10.88.0.28. Set the 'ServerName' directive globally to suppress this message
*
root@be9b30ee722b:/#
功夫不负有心人,终于成功了。在浏览器也可以访问。
当然,虽然现在可以自动启动Apache服务了,但仍然离完全可用还有一定距离。不过今天已经晚了,改天接着折腾。