比如这样的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?
使用 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"
感谢分享,学习了。我在阿里云买的是云服务器,同样安装了Humpback。不知道你们是直接在云服务器上安装docker呢?还是利用现成的服务运行镜像?
@幻天芒: 我们使用的阿里云容器服务( cs.console.aliyun.com ),容器服务自动给集群中的服务器安装docker。
@dudu: 刚看了下,基本上是全自动集群了。
之前,我们是自己写C来启动真正的程序,以及监听信号。
现在,我们一般用 https://github.com/Yelp/dumb-init 来作为入口程序。
Dockerfile如下:https://github.com/hstarorg/simple-file-store/blob/master/docker/dockerfile
试过了,使用 dumb-init 还是会退出
@dudu: 可以考虑在shell中,写一个暂停。
@幻天芒: 如果添加一个 tail -f /dev/null 命令,自己用 docker-compose up 运行容器不会退出,当使用阿里云容器服务(docker swarm)时,容器依然会退出,对应的错误是 "context deadline exceeded"