为什么有的images需要在docker-compose.ymll设置tty:true 而其他images不需要?
问题
我一直在寻找答案有一段时间了,但我还没有找到它,我需要在我继续我的测试前理解它。
我正在通过安装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 "$@"
第一次尝试bash时,我无法使用以下命令访问:
docker-compose exec myalpine bash
但是如果我找到了答案,我就必须输入我的docker-compose.ymltty: true,在启动命令docker-compose up -d之后,我已经能够访问myalpine容器shell了
我的docker-compose.yml的一部分结果如下
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的其他服务中,比如mysql,我可以访问bash而不添加tty:true?
Example:
docker-compose exec mysql bash
我不需要在docker-compose.yml中添加tty:true就可以访问,所以阿尔卑斯山的图像中一定有我不明白并且想理解的东西。
发布于 1 年前
答案
在运行docker-compose up之后,我用dockerfile和docker-compose.yaml的cut-down版本复制了您的示例。首先,我运行时没有附加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。这将尝试创建一个interactive shell,但是由于没有tty,shell的创建失败,容器停止。因为容器被标记为restart: unless-stopped,所以它将处于一个不断重新启动的循环中。
因为容器没有运行,所以不能执行docker-compose exec myalpine bash
一旦您将tty添加到容器中,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
mysql不是这样的原因是,这个映像最终启动了一个daemon进程,这个进程是从tty分离出来的non-interactive进程。
更多推荐
所有评论(0)