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

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

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

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


当前回答

Docker-compose run myapp sh应该做这个处理。

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

其他回答

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

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

SERVICE_NAME将是“zookeeper”。

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

那么执行起来就很简单了 Docker exec -ti xyz123 /bin/bash

瞧,一个交互壳。

我更喜欢

docker-compose exec my_container_name 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。

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