使用Docker Compose的交互式shell

dru*_*ubb 214 shell interactive docker docker-compose

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

myapp:
  image: alpine:latest
  entrypoint: /bin/sh
Run Code Online (Sandbox Code Playgroud)

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

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

小智 271

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

stdin_open: true
tty: true
Run Code Online (Sandbox Code Playgroud)

第一个对应于-iin docker run,第二个对应于-t.

  • 如果我使用 `docker-compose up` 和入口点 `["/bin/sh"]`,这仍然不起作用。尽管容器并不立即存在。输入是否附加到入口点? (13认同)
  • @TheFool,即使我也遇到了同样的问题。最好运行docker-compose run <service_name> (6认同)
  • 与 docker Attach <container_name> 配合良好 (5认同)
  • 这个具体添加在哪里呢?服务里面? (4认同)
  • `stdin_open`是缺少的链接,因为当我附加到我的一个已经运行shell的容器时,只是为我提供了预期的行为. (2认同)

dne*_*hin 177

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

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

你也可以使用

docker exec -ti <container name> /bin/bash
Run Code Online (Sandbox Code Playgroud)

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

  • 注意,如果暴露任何端口(例如Web服务器),则需要添加`--service-ports` (16认同)
  • 我已经更新了我的答案以提供更多信息并添加`--rm`标志以便删除容器.@ lynx0123的答案是不正确的.如果你运行`docker-compose up`,你将无法获得交互式shell. (8认同)
  • docker-compose up -d && docker attach <container_name> (6认同)
  • 这应该是最好的答案.这是我来到这里时所寻找的. (4认同)
  • 为了使用Docker for Windows工作,我需要docker-compose v.1.9.0(参见Github [issue](https://github.com/docker/compose/issues/3194)和[PR](https: //github.com/docker/compose/pull/3980)).截至2016年12月19日,它只附带了适用于Windows的Docker测试版.那么`docker-compose run`就可以了.您还需要将`command:/ bin/bash`添加到docker-compose.yml. (2认同)

cla*_*lay 46

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

version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"
Run Code Online (Sandbox Code Playgroud)

在开始之后docker-compose up,您可以轻松地将redis容器装入容器或web容器中:

docker-compose exec redis sh
docker-compose exec web sh 
Run Code Online (Sandbox Code Playgroud)


Ale*_*var 34

docker-compose run myapp sh 应该做的交易.

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

  • 太感谢了。只需添加一点即可澄清。docker-compose 运行 [您的服务名称在 docker-compose.yml 中定义] [sh 或 bash]。 (5认同)

Dav*_*sey 21

使用docker-compose,我发现最简单的方法是做一个docker ps -a(在启动我的容器后docker-compose up)并获取我希望有一个交互式shell的容器的ID(让我们称之为xyz123).

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

瞧,互动的外壳.

  • @ericmjl因为这是一个两步过程,其中问题具体涉及使用docker-compose功能,并且已在其他答案中说明 (4认同)
  • 不知道为什么这被否决了 - 这是在出现问题时进行调试的好方法,并且我成功地使用了这种方法,就像在阅读此解决方案的一分钟内一样。 (2认同)

小智 10

如果未来的任何人也想知道这里:

docker-compose exec container_name sh
Run Code Online (Sandbox Code Playgroud)

要么

docker-compose exec container_name bash
Run Code Online (Sandbox Code Playgroud)

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

docker-compose exec container_name php -v
Run Code Online (Sandbox Code Playgroud)

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

  • 这是不正确的:“docker-compose exec &lt;service_name&gt;”,而不是“docker-compose exec &lt;container_name&gt;”。 (2认同)

小智 9

我更喜欢

docker-compose exec my_container_name bash
Run Code Online (Sandbox Code Playgroud)


Car*_*tin 5

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

docker run -it -p 3000:3000 -v /app/node_modules -v $(pwd):/app <your_container_id>
Run Code Online (Sandbox Code Playgroud)

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

version: '3'
services:
    frontend:
        stdin_open: true
        tty: true
        build: 
            context: .
            dockerfile: Dockerfile.dev
        ports: 
            - "3000:3000"
        volumes: 
            - /app/node_modules
            - .:/app
Run Code Online (Sandbox Code Playgroud)

这使诀窍: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"]
Run Code Online (Sandbox Code Playgroud)

希望这个例子能帮助其他人在 docker 容器中运行前端(例子中的反应)。


Cle*_*ral 5

如果yml被调用docker-compose.yml,则可以使用简单的$ docker-compose up. 终端的相应附件可以很简单(考虑到yml指定了一个名为 的服务myservice):

$ docker-compose exec myservice sh

Run Code Online (Sandbox Code Playgroud)

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

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

Run Code Online (Sandbox Code Playgroud)


Mai*_*rey 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