我正在尝试编写引用同一目录中的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"
任何帮助将不胜感激!
答案 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 ...
,以便它可以使终端正确。