docker-compose启动容器后执行脚本或命令不退出 | 运行内部程序

摘要:
好在,docker还有个特别之处,我们可以通过dockerbuild读取到Dockerfile中的指令后,在构建新镜像再起容器的时候,可以直接执行脚本文件运行容器内部应用程序,同时不退出容器。在dockerbuild新镜像后,同样docker-composeup-d启动容器服务,查看容器状态docker-composeps,进入容器并查看进程:事实证明,确实有效。上述操作,解决了docker-compose启动容器时,运行脚本文件来起容器内部的应用程序,且容器正常运行up的需求。

说下我的需求,就是在使用 docker-compose 启动server容器后,执行命令或者执行脚本运行容器内部的进程。

容器是个基于django框架的web server,通过uwsgi启动,我是这样操作的:

  • 1.在docker-compose.yaml文件中,在容器设置部分加入entrypoint: /root/path/xxx.sh,另外也编辑command: bash

  • 2.启动服务,docker-compose up -d,后台进程启动服务,

  • 3.查看服务,docker-compose ps,发现容器处于Restarting,换句话说,容器启动有问题,

  • 4.先停止服务,docker-compose stop

于是,我注释掉docker-composeentrypoint部分,然后docker-compose up -d,查看服务docker-compose ps,容器处于up状态,于是我通过exec命令在容器中执行相关命令,如下图:
docker-compose启动容器后执行脚本或命令不退出 | 运行内部程序第1张

可以看到uwsgi进程是起来了,本地测试web server的接口,
docker-compose启动容器后执行脚本或命令不退出 | 运行内部程序第2张

显然,这与我们的初衷不符,在 docker-compose 的时候,通常希望通过docker-compose up -d起来容器后,容器内部的应用程序就起来了,如果我们还需要通过exec,这种操作未免多余。

好在,docker还有个特别之处,我们可以通过 docker build 读取到 Dockerfile中的指令后,在构建新镜像再起容器的时候,可以直接执行脚本文件运行容器内部应用程序,同时不退出容器。

Dockerfile的设置:

# dockerfile to build image for docker-compose
FROM xxxxx/xxxserver-ubuntu16.04:1.0

MAINTAINER xxx@google.com.cn

ENV PYTHON 2.7

ENV DJANGO 1.11.5

LABEL version=1.1

WORKDIR /opt/big_factory/xxxserver

EXPOSE 9443

# 此处设置ENTRYPOINT,在创建容器的时候会运行此命令,执行脚本,起应用服务
ENTRYPOINT ["sh","/root/xxxserver/uwsgi_run.sh"] 

在对应的脚本文件中,这样设置:

#!/bin/bash

# run itpserver with uwsgi
/usr/local/bin/uwsgi -d --ini /opt/big_factory/xxxserver/xxxapi_uwsgi.ini

# never exit,此处是为了运行完上条应用服务后,有对应的前台进程
tail -f /dev/null

本文中的脚本文件用的是 tail 命令,当然也可以用其他的命令,如ping, top, sleep等,只不过tail相对系统开销小,而且/dev/null是个黑洞,啥都可以往里扔,也不显示。

接下来看看效果怎样。

docker build新镜像后,同样docker-compose up -d启动容器服务,查看容器状态docker-compose ps,进入容器并查看进程:
docker-compose启动容器后执行脚本或命令不退出 | 运行内部程序第3张

事实证明,确实有效。

上述操作,解决了 docker-compose 启动容器时,运行脚本文件来起容器内部的应用程序,且容器正常运行up的需求。

总结
如果我们通过 docker-compose 运行容器,并运行内部应用服务的话,可以按照以下设置进行操作:

  • 1.编写Dockerfile,在文件中设置ENTRYPOINT指令,一般可以执行启动应用的脚本文件,脚本文件最后应该有不退出的命令,如tail/top/ping等,然后通过docker build -t name:tag .创建新的镜像

  • 2.编写docker-compose.yml/yaml文件,内部指定基于Dockerfile创建的镜像

  • 3.通过 docker-compose up -d启动容器

---------------------------------------------------------------------------------
此处对于 CMD | commandENTRYPOINT | entrypoint 在 dockerfile 和 docker-compose 并未详细涉及,详情请看以下博文:
docker容器之dockerfile&docker-compose CMD/entrypoint详解

免责声明:文章转载自《docker-compose启动容器后执行脚本或命令不退出 | 运行内部程序》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python中如何调用.py文件WindowsForm实现折叠菜单面板下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

部署经验Docker

从Docker 到Jenkins 到Ansible的部署经验 https://www.cnblogs.com/itdragon/p/10011816.html 工作中,除了开发功能,还负责系统的部署工作。我从频繁的部署工作中,逐渐找到了一些偷懒的方法。从传统的Java -jar命令启动服务,到通过Docker 容器构建部署服务,再后来通过自动化部署工具Je...

如何查看ubuntu版本

用Ubuntu好久了,是在win7系统中装的双系统,以前只知道自己使用的是什么20版本的,具体怎么看还不知道,下面写一下查看当前ubuntu系统的版本的方法. 注:proc目录下记录的当前系统运行的各种数据,version记录的版本信息直接可以通过cat查看到。 方法1.使用命令:lsb_release -a 查看 可以看到是Ubuntu 20.04.1...

诊断工具--arthas使用教程

1.背景  Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断 工具。 2.解决问题 得益于 Arthas 强大且丰富的功能,让 Arthas 能做的事情超乎想象。下面仅仅列举几项常见的使用情况,更多的使用场景可以在熟悉了 Arthas 之后自行探索。 是否有一个全局视角来查看系统的运行状况? 为什么 CPU 又升高了,到底...

02_iOS 沙盒及各个目录详解

处于安全考虑,一个iosAPP对系统文件的交互权限被限制在app的沙盒目录下。 在安装一个新的app的时候,安装程序会在沙盒目录下创建许多的容器,每个容器目录都有特定的角色。 bundle容器目录:保存应用程序的包(主bundle的资源等) 数据容器目录:就是我们平时开发中用到的Documents,library temp。运行的时候app可以额外的申请容...

adb命令大全

基本用法 命令语法 adb 命令的基本语法如下: 1 adb [-d|-e|-s <serialNumber>] <command> 如果只有一个设备/模拟器连接时,可以省略掉[-d|-e|-s <serialNumber>]这一部分,直接使用adb <command>。 为命令指定目标设备 如果有多个设备...

linux下调试C程序

正文:==================GDB是一个强大的命令行调试工具。大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本。UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能。于是UNIX下的软件比Windows下的软件更能...