使用 Docker Compose 的交互式 shell

问题描述 投票:0回答:14

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

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

当我使用 docker-compose up 启动此容器时,它会立即退出。是否有任何标志可以添加到

entrypoint
命令中,或者作为
myapp
的附加选项来启动交互式 shell?

我知道有本地 docker 命令选项可以实现此目的,只是好奇是否也可以仅使用 Docker Compose。

shell docker interactive docker-compose
14个回答
758
投票

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

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

第一个对应于

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


440
投票

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

docker-compose run --rm myapp

(服务名称

myapp
取自您的示例。更一般地说:它必须是 docker-compose 文件中现有的服务名称,
myapp
不仅仅是您选择的命令。示例:
bash
代替
myapp
在这里不起作用。)

您可以设置

stdin_open: true, tty: true
,但这实际上不会为您提供
up
的正确 shell,因为日志是从所有容器中传输的。

您也可以使用

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

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


141
投票

官方入门示例(https://docs.docker.com/compose/gettingstarted/)使用以下

docker-compose.yml

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"

使用

docker-compose up
启动此操作后,您可以使用以下命令将其装入
redis
容器或
web
容器中:

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

88
投票

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

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


60
投票

如果未来有谁也来到这里:

docker-compose exec service_name sh

docker-compose exec service_name bash

或者你可以运行单行,比如

docker-compose exec service_name php -v

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

service_name
在您的
docker-compose.yml
文件中定义


38
投票

使用 docker-compose,我发现最简单的方法是执行

docker ps -a
(在使用
docker-compose up
启动我的容器之后)并获取我想要在其中拥有交互式 shell 的容器的 ID(我们称之为xyz123)。

然后执行起来就很简单了

docker exec -ti xyz123 /bin/bash

瞧,一个交互式 shell。


10
投票

这个问题对我来说非常有趣,因为我遇到了问题,当我在执行完成后运行容器时,立即退出并用 -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 容器中运行前端(示例中的 React)。


9
投票

我更喜欢

docker-compose exec my_container_name bash

9
投票

您可以使用以下命令通过 docker-compose 获得交互式 shell(考虑到

yml
已指定名为
myservice
的服务):

$ docker-compose exec myservice sh

如果使用不同的

yml
文件名,例如
docker-compose-mycompose.yml
,要获取交互终端,需要指定
yml
,如:

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


5
投票

对这个老问题的补充,因为我上次只遇到过这种情况。 sh 和 bash 的区别。因此,可能会出现某些 bash 不起作用而只有 sh 起作用的情况。

所以你可以:

docker-compose exec CONTAINER_NAME sh

并且在大多数情况下:

docker-compose exec CONTAINER_NAME bash

使用。

如果你有时间。 sh 和 bash 之间的区别在这里得到了很好的解释: https://www.baeldung.com/linux/sh-vs-bash


4
投票

您可以在命令行上执行

docker-compose exec SERVICE_NAME sh
SERVICE_NAME
在您的
docker-compose.yml
中定义。例如,

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

SERVICE_NAME
将是“动物园管理员”。


2
投票

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

你可以用这个

docker-compose run --rm app bash

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


0
投票

我发现下面的步骤可以打开交互式shell,虽然不是直接用

docker-compose
:

  • 运行后
    docker-compose up
  • 使用
    docker ps -a
  • 检查容器的名称
  • 选择要为其打开交互式 bash shell 的容器名称
  • 奔跑
    docker exec -it containerName bash

您的终端现在应该位于容器的 bash shell 中,您可以与其内容进行交互。

希望这有帮助。


0
投票

您可以通过docker

shell
执行
compose run

compose.yml:

services:
  myapp:
    build: .

Dockerfile

FROM alpine:latest

主机上的命令行

docker compose run --rm myapp sh -c "/bin/sh"

您可能还想在 compose 文件中挂载一些卷,以保留您在 compose.yml 中在容器内执行的任何操作:

services: myapp: build: . volumes: - .:/app
我已将主机上的当前目录挂载到容器内的目录

/app

© www.soinside.com 2019 - 2024. All rights reserved.