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)
第一个对应于-i
in docker run
,第二个对应于-t
.
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.
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
Dav*_*sey 21
使用docker-compose,我发现最简单的方法是做一个docker ps -a
(在启动我的容器后docker-compose up
)并获取我希望有一个交互式shell的容器的ID(让我们称之为xyz123).
然后执行它是一件简单的事情
docker exec -ti xyz123 /bin/bash
瞧,互动的外壳.
小智 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)
那是在您已经启动容器并运行之后
这个问题对我来说很有趣,因为我有问题,当我在执行完成后运行容器时立即退出并使用 -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 容器中运行前端(例子中的反应)。
如果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)
对这个老问题的补充,因为我上次只遇到过这种情况。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
归档时间: |
|
查看次数: |
151585 次 |
最近记录: |