有没有办法只使用Docker Compose在容器中启动交互式shell?我在docker-compose.yml中尝试过类似的东西:
myapp:
image: alpine:latest
entrypoint: /bin/sh
当我使用docker-compose启动此容器时,它会立即退出。是否有任何可以添加到entrypoint命令的标志,或作为myapp的附加选项,以作为交互式shell启动?
我知道有一些原生的docker命令选项可以实现这一点,只是好奇是否也可以只使用Docker Compose。
答案 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