Docker-compose运行Alpine 镜像启动失败

先放结果

设置tty: true选项
如:

version: '3'
services:
  alpine:
    image: alpine
    container_name: alpine
    tty: true

过程说明

今天使用docker-compose编排工具尝试运行一个空白的Alpine容器服务.
本计划使用最简单设置.但是遇到了启动失败的情况,但是手动使用docker run又可以执行.问题有点蹊跷.
初始docker-compose.yml文件内容如下:

version: '3'
services:
  alpine:
    image: alpine
    container_name: alpine

这本来是一个足够简单的启动配置了.但是竟然启动失败了.并且使用docker logs 还看不到日志输出.这就说明启动时的第一个命令就直接失败了.
下面是手动执行命令:

docker run -dit --name alpine alpine

结果这样容器就可以正常启动起来了.
后来到QQ群里面求助,又网友建议修改docker-compose文件如下:

version: '3'
services:
  alpine:
    image: alpine
    container_name: alpine
    command: /bin/sh -c "while true;do sleep 3600;done"

这样也可以正常运行.问题暂时得到了解决.但是原因依然不知道.
接下来,又查了一下docker-compose的写法.偶然看到有个配置项:tty: true
突然灵光一现,会不会是因为没设置这一项导致的?
仔细一想,确实有可能,因为在docker run 命令中有指定-t选项.而这样是可以成功的.
试了一下,果然可以!

version: '3'
services:
  alpine:
    image: alpine
    container_name: alpine
    tty: true
    # command: /bin/sh -c "while true;do sleep 3600;done"

于是,这就说明之前不能成功的原因就在这里了.因为容器启动时,会运行命令:/bin/sh但是后面没有指定任何内容,且没有设置虚拟控制台常驻.因为这个命令一瞬间就执行成功并退出了.后来在命令后面加上了死循环,也就是命令不会结束,容器也就可以一直运行了。而docker run因为有选项指定常驻,其实是和tty: true等效的。

又明白了一点东西。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐