当前位置: 首页 > 知识库问答 >
问题:

为什么在docker-compose.yml中需要tty:true而其他图像不需要?

呼延化
2023-03-14

我一直在寻找答案,但我没有找到它,我需要在我继续我的测试之前弄明白。

我正在通过安装bash创建一个基于Alpine的映像,如下图所示:

FROM alpine:3.12

RUN apk add --no-cache --upgrade bash rsync gzip \
&& rm -rf /var/cache/apk/*

COPY ./docker/backup/hello.sh /hello.sh

RUN mkdir /backup \
&& chmod u+x /hello.sh

WORKDIR /backup

ENTRYPOINT ["sh","/hello.sh"]
CMD ["/bin/bash"]

Hello.sh

#!/bin/sh
echo "=> Hello Word"
echo "$@"
exec "$@"
docker-compose exec myalpine bash
services:
  myalpine:
    build:
      context: ./
      dockerfile: ./docker/backup/Dockerfile
      args:
        - DOCKER_ENV=${DOCKER_ENV}
    restart: unless-stopped
    tty: true
    container_name: ${PROJECT_NAME}-files
    volumes:
      - appdata:/app
      - ./data/app/backup:/backup
  mysql:
    build:
      context: ./
      dockerfile: ./docker/mysql/Dockerfile
      args:
        - MYSQL_VERSION=${MYSQL_VERSION}
        - DOCKER_ENV=${DOCKER_ENV}
    restart: always
    container_name: ${PROJECT_NAME}-mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - db
docker-compose exec mysql bash

我可以在不向docker-compose.yml添加tty:true的情况下访问,所以Alpine的映像中一定有我不理解和希望理解的东西。

共有1个答案

席兴朝
2023-03-14

我用dockerfile和docker-compose.yaml的精简版本复制了您的示例,然后运行docker-compose up。首先,我在没有附加TTY的情况下运行,因此有以下内容:

~$ docker-compose up
...
...
WARNING: Image for service myalpine was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating test-fies ... done
Attaching to test-fies
test-fies   | => Hello Word
test-fies   | /bin/bash

~# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS                                  PORTS                                              NAMES
9a72817b0e28   tty_up_myalpine   "sh /hello.sh /bin/b…"   5 minutes ago   Restarting (0) Less than a second ago                                                      myalpine-fies

如您所见,容器一直在重新启动。原因是hello.sh作为入口点将接收命令/bin/bash执行bash。这将尝试创建交互式shell,但是由于没有TTY,因此shell的创建失败,容器停止。因为容器标记为restart:除非-stopped,所以它将处于一个不断的重新启动循环中。

由于容器未运行,您无法执行docker-compose exec myalpine bash

CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS         PORTS                                              NAMES
745f5139f510   tty_up_myalpine   "sh /hello.sh /bin/b…"   10 seconds ago   Up 9 seconds                                                      myalpine-fies
 类似资料:
  • 问题内容: 我正在用查询执行ajax请求,想知道为什么我的响应已经是JS对象。 如果我做一个 ‘obj’为null,但是我可以将’response’用作js对象数组。 这不是真正的问题,但是我想了解这种行为。 谢谢 问题答案: 当您进行AJAX调用并指定dataType JSON时,就会发生这种情况jQuery会在响应中为您调用jQuery.parseJSON。实际上,您可以根据数据类型指定要调用

  • 我上了Java的课程,正在努力自学C和K 在Java中,您可以声明一个类似于公共静态浮点转换(int f)的函数,而不需要原型。这对我来说似乎简单得多。为什么会有差异?

  • 如果我在我的类中创建一个bool,就像一样,它默认为false。 当我在我的方法中创建相同的bool时,我得到一个错误“使用未分配的局部变量检查”。为什么?

  • /usr/include/c++/7.2.0/bits/stl_function.h:在'constexpr bool std::greater<_tp>::operator()(const_tp&,const_tp&)const[with_tp=MyStruct]': /usr/include/c++/7.2.0/bits/stl_function.h:376:20:错误:与'operator>

  • 互联网是超文本标记语言(HTML)页面的集合,它们彼此链接以形成概念性信息网络。随着时间的推移,静态资源数量增加,图像等更丰富的项目开始成为Web结构的一部分。 高级服务器技术允许动态服务器页面 - 其内容基于查询生成的页面。 很快,需要拥有更多动态网页才能获得动态超文本标记语言(DHTML)。一切都归功于JavaScript。在接下来的几年中,我们看到了跨帧通信,试图避免页面重新加载,然后在帧内

  • 当前信息时代,哪里都是应用程序。这些应用程序们不仅仅是运行人们工作场所的工具 - 它们现在正在经营人们的生活。 对即时响应的需求,完美的行为和更多的功能是前所未有的。 而且,当然,人们期望应用程序在不同类型的设备上运行平稳,特别是在移动设备上。 应用程序执行的速度与它所做的一样重要。 NGINX的核心功能,例如其具有高性能HTTP和反向代理服务器的大规模可扩展事件驱动架构,访问和带宽控制以及与各种