dmc94
dmc94

Reputation: 536

How can I run two instances of a command in a container?

I am trying to write a docker-compose file that references a Dockerfile in the same directory. The purpose of this docker-compose file is to run the command htop when I build my Dockerfile image it runs htop perfectly fine and I can pass arguments to an entry point. Whenever I go to try to run docker-compose up it starts the htop instances but then exits immediately. Is there anyway I can open two terminals or two containers and each container be running an htop instance?

Dockerfile:

FROM alpine:latest

MAINTAINER anon

RUN apk --no-cache add \
    htop

ENTRYPOINT ["htop"]

docker-compose.yml

version: '3'

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

Any help would be greatly appreciated!

Upvotes: 0

Views: 973

Answers (2)

Jesse Chisholm
Jesse Chisholm

Reputation: 4005

On the issue of your htop command exiting, thus causing your docker container to exit.

This is normal behavior for docker containers. The htop is most likely exiting because it can't figure out the terminal when in a docker image, as @petre mentioned. When you run your docker image, be sure to use the -i option for an interactive session.

docker run -it MYIMAGE htop

To change the docker auto-exit behavior, do something like this in your Dockerfile:

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

This runs your MYCOMMAND command over and over again, but allows the container to be stopped when you want. You can run a docker exec -it MYCONTAINER sh when you want to do other things in that same container.

Also, if you happen to be running docker in Windows, then prefix a winpty to the docker command like: winpty docker ... so it can get the terminal correct.

Upvotes: 0

petre
petre

Reputation: 1543

The immediate problem is a terminal incompatibility. You run this from a terminal that is unknown to the software in the docker image.

The second problem, of the containers exiting immediately, could be fixed by using a proper init like tini:

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"]

To run the two services in parallel, as they each need a controlling terminal, you would run, from two different terminals:

docker-compose up htop_one

and

docker-compose up htop_two

respectively.

Note this is creating two containers from the same image. Each docker-compose service is, of course, run in a separate container.

If you'd like to run commands in the same container, you could start a service like

docker-compose up myservice

and run commands in it:

docker exec -it <container_name> htop

from different terminals, as many times as you'd like.

Not also that you can determine container_name via docker container ls and you can also set the container name from the docker-compose file,

Upvotes: 2

Related Questions