有什么方法可以在容器中只使用Docker Compose启动一个交互式shell吗?我在docker-compose.yml中尝试过这样的东西:

myapp:
  image: alpine:latest
  entrypoint: /bin/sh

当我使用docker-compose up启动这个容器时,它立即退出。是否有任何标志,我可以添加到入口点命令,或作为myapp的额外选项,以启动交互式shell?

我知道有本地docker命令选项来实现这一点,只是好奇是否只使用docker Compose也可以。


当前回答

可以在命令行执行docker-compose exec SERVICE_NAME sh。SERVICE_NAME在docker-compose.yml中定义。例如,

services:
    zookeeper:
        image: wurstmeister/zookeeper
        ports:
          - "2181:2181"

SERVICE_NAME将是“zookeeper”。

其他回答

使用docker-compose获得交互式shell的规范方法是使用:

docker-compose run --rm myapp

(服务名myapp取自您的示例。更通用的是:它必须是docker-compose文件中现有的服务名称,myapp不仅仅是您选择的命令。示例:bash而不是myapp将不能在这里工作。)

你可以设置stdin_open: true, tty: true,但是这实际上不会给你一个合适的shell up,因为日志是从所有容器中流出来的。

你也可以使用

docker exec -ti <container name> /bin/bash

在运行的容器上获得外壳。

你需要在docker-compose.yml中包含以下行:

version: "3"
services:
  app:
    image: app:1.2.3
    stdin_open: true # docker run -i
    tty: true        # docker run -t

第一个对应docker run中的-i,第二个对应-t。

根据文档-> https://docs.docker.com/compose/reference/run/

你可以使用这个docker-compose run——rm app bash

[app]是docker-compose.yml中服务的名称

如果有来自未来的人也在这里游荡

docker-compose exec service_name sh

or

docker-compose exec service_name bash

或者你可以像这样单行

docker-compose exec service_name php -v

这是在容器已经启动并运行之后。

service_name在docker-compose中定义。yml文件

使用docker-compose,我发现最简单的方法是做一个docker ps -a(启动我的容器与docker-compose up),并获得我想要有一个交互式shell的容器的ID(让我们称之为xyz123)。

那么执行起来就很简单了 Docker exec -ti xyz123 /bin/bash

瞧,一个交互壳。