交互式shell使用Docker Compose

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

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

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

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

480549 次浏览

使用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

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

你需要在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

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

那么执行起来很简单 docker exec -ti xyz123 /bin/bash < / p >

瞧,一个交互壳。

官方入门示例(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

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

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

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

docker-compose exec service_name sh

docker-compose exec service_name bash

或者你可以像这样单行

docker-compose exec service_name php -v

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

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

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

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

SERVICE_NAME将是“zookeeper”。

这个问题对我来说非常有趣,因为我有问题,当我运行容器执行完成后立即退出,我用-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)。

如果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


我更喜欢

docker-compose exec my_container_name bash

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

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

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

这是对这个老问题的补充,因为我上次只有这个箱子。sh和bash之间的区别。因此,对于某些bash不工作,而只有sh可以工作的情况可能会发生。

所以你可以: docker-compose exec CONTAINER_NAME sh < / p >

在大多数情况下:docker-compose exec CONTAINER_NAME bash

使用。

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