首页 新闻 会员 周边 捐助

如何让docker容器在执行shell命令后不退出运行

0
悬赏园豆:50 [已解决问题] 解决于 2017-06-11 17:06

比如这样的compose文件

version: '3'
services:
  cache-service:
    image: microsoft/aspnetcore:2.0
    depends_on:
      - dotnet-publish
    volumes:
      - share:/app
    command: bash -c "cd /app && dotnet Cnblogs.Cache.WebApi.dll"
  dotnet-publish:
    image: cnblogs/cache-service:latest
    volumes:
      - share:/app
    command: bash -c "cd /app && rm -rf * && cp -r /src/Cnblogs.Cache.WebApi/publish/* ."
    tty: true
volumes:
  share:

在dotnet-publish容器运行时,在执行完command中的shell命令后,容器就自动退出了。

复制代码
# docker-compose up
Creating volume "cacheservice_share" with default driver
Recreating cacheservice_dotnet-publish_1 ... 
Recreating cacheservice_dotnet-publish_1 ... done
Recreating cacheservice_cache-service_1 ... 
Recreating cacheservice_cache-service_1 ... done
Attaching to cacheservice_dotnet-publish_1, cacheservice_cache-service_1
cacheservice_dotnet-publish_1 exited with code 0
复制代码

即使添加了 tty: true ,也不作用。如果没有 command 配置, tty: true 会起作用,容器不会退出。

请问如何解决这个问题?

【相关链接】

How to Keep Docker Container Running After Starting Services?

dudu的主页 dudu | 高人七级 | 园豆:30636
提问于:2017-06-10 08:39
< >
分享
最佳答案
1

使用  tail -f /dev/null 命令可以解决问题(当时在阿里云容器服务时遇到的"context deadline exceeded"问题后来消失了)。

command: bash -c "cd /app && rm -rf * && cp -r /src/Cnblogs.Cache.WebApi/publish/* . && tail -f /dev/null"
dudu | 高人七级 |园豆:30636 | 2017-06-11 17:06

感谢分享,学习了。我在阿里云买的是云服务器,同样安装了Humpback。不知道你们是直接在云服务器上安装docker呢?还是利用现成的服务运行镜像?

幻天芒 | 园豆:37207 (高人七级) | 2017-06-11 22:45

@幻天芒: 我们使用的阿里云容器服务( cs.console.aliyun.com ),容器服务自动给集群中的服务器安装docker。

dudu | 园豆:30636 (高人七级) | 2017-06-12 07:50

@dudu: 刚看了下,基本上是全自动集群了。

幻天芒 | 园豆:37207 (高人七级) | 2017-06-12 20:50
其他回答(1)
0

之前,我们是自己写C来启动真正的程序,以及监听信号。

现在,我们一般用 https://github.com/Yelp/dumb-init 来作为入口程序。

Dockerfile如下:https://github.com/hstarorg/simple-file-store/blob/master/docker/dockerfile

收获园豆:50
幻天芒 | 园豆:37207 (高人七级) | 2017-06-10 08:49

试过了,使用 dumb-init 还是会退出

支持(0) 反对(0) dudu | 园豆:30636 (高人七级) | 2017-06-10 16:11

@dudu: 可以考虑在shell中,写一个暂停。

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2017-06-10 21:43

@幻天芒: 如果添加一个 tail -f /dev/null 命令,自己用 docker-compose up 运行容器不会退出,当使用阿里云容器服务(docker swarm)时,容器依然会退出,对应的错误是 "context deadline exceeded"

支持(0) 反对(0) dudu | 园豆:30636 (高人七级) | 2017-06-11 09:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册