0

我对 Docker 很陌生,我正在尝试 Dockerize 一个难以在不同平台上运行的特定工具。出于某种原因,ENTRYPOINT 和 CMD 命令没有像我预期的那样工作。

令我困惑的是,当我从容器内部运行脚本时,脚本可以工作,但是当我运行我认为传递运行时参数的完全相同的东西时,我得到的响应与脚本完全不同。我希望他们是一样的。

这是我的 Dockerfile

FROM ubuntu:latest

RUN apt-get -y update
RUN apt-get -y install build-essential flex bison

COPY . /unicornscan
WORKDIR /unicornscan

RUN patch src/unilib/tsc.c patches/unicornscan-0.4.7-gcc5.patch
RUN ./configure CFLAGS=-D_GNU_SOURCE --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-bundled-ltdl
RUN make
RUN make install

ENTRYPOINT ["/usr/bin/unicornscan"]
CMD []

当我从 dockerfile 中删除入口点和 cmd 然后运行:

docker run -it test/image:1.0 sh

我在容器里。然后我运行:

/bin/sh -c "unicornscan -I -msf 22.22.22.22:a"

它开始告诉我在 IP 22.22.22.22 上打开了哪些端口,这是这个工具应该做的。

现在,我添加入口点和 cmd 命令,重新构建,然后运行

docker run test/image:1.0 -I -msf 22.22.22.22:a

现在我从工具中得到这个输出:

Send exiting ack, parent died?: system error No such file or directory

每次我重复这个过程都会发生同样的事情,所以我的问题是,为什么?这两个命令有什么区别。我的印象是它们完全一样。

4

2 回答 2

0

如果以后有人遇到这个问题,我就是这样解决的。

Dockerfile:

FROM ubuntu:latest

RUN apt-get -y update
RUN apt-get -y install build-essential flex bison

COPY . /unicornscan
WORKDIR /unicornscan

RUN patch src/unilib/tsc.c patches/unicornscan-0.4.7-gcc5.patch
RUN ./configure CFLAGS=-D_GNU_SOURCE --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-bundled-ltdl
RUN make
RUN make install
RUN chmod +x entrypoint.sh
ENTRYPOINT ["/unicornscan/entrypoint.sh"]
CMD []

/unicornscan/entrypoint.sh :

#!/bin/bash
unicornscan "$@"

原来,当我最初运行时:

docker run test/image:1.0 -I -msf 22.22.22.22:a

它被解释为:

/bin/sh -c unicornscan -I -msf 22.22.22.22:a

使用包装脚本,它现在被解释为:

/bin/sh -c "unicornscan -I -msf 22.22.22.22:a"
于 2019-09-02T07:17:21.390 回答
0

ENTRYPOINT ["/usr/bin/unicornscan"]在没有 bash 的情况下执行unicornscan,使用 PID 1 并允许它接收像 SIGTERM 这样的信号。

/bin/sh -c "unicornscan -I -msf 22.22.22.22:a"unicornscan作为 的子进程运行/bin/sh

我不知道任何事情unicornscan,但我会尝试将您更改ENTRYPOINT["/bin/sh", "-c", "/usr/bin/unicornscan"]并看看会发生什么。

于 2019-09-02T02:40:20.833 回答