使用Docker Compose的交互式shell

时间:2016-03-27 16:25:58

标签: shell docker interactive docker-compose

有没有办法只使用Docker Compose在容器中启动交互式shell?我在docker-compose.yml中尝试过类似的东西:

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

当我使用docker-compose启动此容器时,它会立即退出。是否有任何可以添加到entrypoint命令的标志,或作为myapp的附加选项,以作为交互式shell启动?

我知道有一些原生的docker命令选项可以实现这一点,只是好奇是否也可以只使用Docker Compose。

10 个答案:

答案 0 :(得分:222)

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

stdin_open: true
tty: true

第一个对应-i中的docker run-t中的@FindAll

答案 1 :(得分:143)

使用docker-compose获取交互式shell的规范方法是使用:docker-compose run --rm myapp

您可以设置stdin_open: true, tty: true,但实际上并没有为您提供up的正确shell,因为正在从所有容器中传输日志。

您也可以使用

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

在正在运行的容器上获取​​shell。

答案 2 :(得分:33)

在官方入门示例(https://docs.docker.com/compose/gettingstarted/)中包含以下docker-compose.yml

version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

使用docker-compose up开始此操作后,您可以轻松地将redis容器或web容器包含在内:

docker-compose exec redis sh
docker-compose exec web sh 

答案 3 :(得分:24)

docker-compose run myapp sh应该做这笔交易。

up / run存在一些混淆,但docker-compose run文档有很好的解释:https://docs.docker.com/compose/reference/run

答案 4 :(得分:21)

使用docker-compose,我发现最简单的方法是执行docker ps -a(在使用docker-compose up启动容器之后)并获取我想要交互的容器的ID shell in(我们称之为xyz123)。

然后执行就是一件简单的事情 docker exec -ti xyz123 /bin/bash

和瞧,一个互动的外壳。

答案 5 :(得分:7)

如果将来有任何人也想知道这里:

docker-compose exec container_name sh

docker-compose exec container_name bash

或者您也可以像这样运行单行

docker-compose exec container_name php -v

那是在您已经启动并运行容器之后

答案 6 :(得分:5)

这个问题对我来说非常有趣,因为我遇到了问题,当我在执行完成后运行容器时立即退出,并使用-it进行了修复:

docker run -it -p 3000:3000 -v /app/node_modules -v $(pwd):/app <your_container_id>

当我必须使用docker compose将其自动化时:

version: '3'
services:
    frontend:
        stdin_open: true
        tty: true
        build: 
            context: .
            dockerfile: Dockerfile.dev
        ports: 
            - "3000:3000"
        volumes: 
            - /app/node_modules
            - .:/app

这可以解决问题: stdin_open:true,tty:true

这是使用create-react-app生成的项目

Dockerfile.dev看起来像这样:

FROM node:alpine

WORKDIR '/app'

COPY package.json .
RUN npm install

COPY . . 

CMD ["npm", "run", "start"]

希望此示例将帮助其他人将前端(在示例中进行响应)运行到Docker容器中。

答案 7 :(得分:4)

如果将yml称为docker-compose.yml,则可以使用简单的$ docker-compose up启动它。终端的相应附件可以很简单(考虑到yml已经指定了称为myservice的服务):

$ docker-compose exec myservice sh

但是,如果您使用其他yml文件名,例如docker-compose-mycompose.yml,则应使用$ docker-compose -f docker-compose-mycompose.yml up启动它。要附加交互式终端,您还必须指定yml文件,就像:

$ docker-compose -f docker-compose-mycompose.yml exec myservice sh

答案 8 :(得分:1)

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

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

SERVICE_NAME将是动物园管理员。

答案 9 :(得分:0)

我更喜欢

docker-compose exec my_container_name bash