打开 Docker 撰写文件中每个服务的外壳选项卡

open a shell tab for each service in a docker compose file

本文关键字:服务 外壳 选项 Docker 文件 打开      更新时间:2023-10-16

我有一个客户端-服务器(都是用C++编写的(应用程序,我正在使用docker-compose进行管理。我对 docker 技术很陌生,我想知道docker-compose up是否可以为我完成以下工作:

  1. 运行服务
  2. 打开docker-compose.yml文件中每个服务的外壳选项卡。

我需要为每个服务提供一个单独的 shell,因为每次我更改代码(在客户端或服务器中(时,我都想停止程序,重新编译并重新运行。目前我使用一种解决方法:

  1. 运行docker-compose up
  2. 运行docker container ls以查找容器 ID
  3. 为每个容器打开一个外壳选项卡并运行docker exec -it <container-id> /bin/bash

我想知道是否有更优雅的解决方案。我正在使用 Ubuntu,这是我的docker-compose.yml

version: '3.1'
services: 
server:
build: ./server
ports: 
- "3500:3500"
volumes: 
- ./server/src:/home/src
- ./server/bin:/home/bin
working_dir: /home/src
stdin_open: true
tty: true
client:
build: ./client
ports: 
- "2800:2800"
volumes: 
- ./client/src:/home/src
- ./client/bin:/home/bin
working_dir: /home/src
stdin_open: true
tty: true
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: example

您可以使用 Docker 的本机映像系统简化此设置。 通常编译应用程序的指令会内置到Dockerfile中,所以运行docker-compose up --build会重新编译东西。 如果应用程序实际上没有更改,Docker 的层缓存系统可以非常快速地运行。 一旦有了它,你就不需要volumes:来覆盖图像内容,也不需要单独连接到每个容器的交互式 shell。

如果您删除Dockerfile中或通常不需要的volumes:和其他一些设置,则会使您的docker-compose.yml更短

version: '3'
services: 
server:
build: ./server
ports: 
- "3500:3500"
# volumes: undo what server/Dockerfile does
# working_dir: is the Dockerfile WORKDIR
# server-type processes don't usually need stdin_open: or tty:
client:
build: ./client
ports: 
- "2800:2800"
db:
# as above

当您更改某些内容时,您可以运行docker-compose up --build -d,它将重建并重新启动需要重建和重新启动的特定内容。

许多docker命令都有直接docker-compose等效项。 例如,如果您确实需要在容器中使用交互式 shell,则可以

docker-compose exec server /bin/sh

docker-compose exec将为你查找 Docker 容器 ID,并默认为docker exec -it标志。

这是我使用 Nginx 的例子

version: '3'
services:
nginx:
stdin_open: true
tty: true
image: nginx        
ports: 
- "80:80"

使用docker-compose run <SERVICE_NAME> sh以交互模式进入容器。这是进入 Nginx 容器交互模式的命令

docker-compose run nginx sh