如何在容器中运行命令的两个实例?

时间:2020-01-04 05:35:01

标签: docker docker-compose dockerfile

我正在尝试编写引用同一目录中的Dockerfile的docker-compose文件。这个docker-compose文件的目的是在我构建Dockerfile映像时运行命令htop,它可以完美地运行htop并且可以将参数传递给入口点。每当我尝试运行docker-compose时,它都会启动htop实例,然后立即退出。无论如何,我可以打开两个终端或两个容器,每个容器运行一个htop实例吗?

Dockerfile:

FROM alpine:latest

MAINTAINER anon

RUN apk --no-cache add \
    htop

ENTRYPOINT ["htop"]

docker-compose.yml

版本:“ 3”

services:
  htop_one:
    build: .
    environment:
      TERM: "linux"
  htop_two:
    build: .
    environment:
      TERM: "linux"

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

当前的问题是终端不兼容。您是从docker映像中的软件未知的终端运行此程序的。

第二个问题是容器立即退出,可以通过使用诸如tini之类的适当init来解决:

Dockerfile:

FROM alpine:latest

MAINTAINER anon

RUN apk --no-cache add \
        htop\
        tini

ENTRYPOINT ["/sbin/tini", "--"]

docker-compose.yaml:

version: '3'
services:
  htop_one:
    build: .
    environment:
      TERM: "linux"
    command: ["top"]

  htop_two:
    build: .
    environment:
      TERM: "linux"
    command: ["top"]

要并行运行两个服务,因为它们每个都需要一个控制终端,所以您可以从两个不同的终端运行:

docker-compose up htop_one

docker-compose up htop_two

分别。

请注意,这是根据同一图像创建两个容器。当然,每个docker-compose服务都在单独的容器中运行。

如果您想在同一容器中运行命令,则可以启动类似服务

docker-compose up myservice

并在其中运行命令:

docker exec -it <container_name> htop

在不同的终端上进行任意次。

不仅可以通过container_name确定docker container ls,还可以从docker-compose文件中设置容器名称,

答案 1 :(得分:0)

在您的htop命令退出的问题上,从而导致docker容器退出。

这是docker容器的正常行为。 htop最有可能退出,因为它在docker映像中无法识别终端,如@petre所述。运行docker映像时,请确保使用-i选项进行交互式会话。

docker run -it MYIMAGE htop

要更改docker自动退出行为,请在Dockerfile中执行以下操作:

CMD exec /bin/sh -c "trap : TERM INT; (while true; do MYCOMMAND; sleep 1000; done) & wait"

这会一遍又一遍地运行您的MYCOMMAND命令,但允许在需要时停止容器。如果您想在同一容器中执行其他操作,则可以运行docker exec -it MYCONTAINER sh

此外,如果您恰巧在Windows中运行docker,请在docker命令之前加上winpty,例如:winpty docker ...,以便它可以使终端正确。