首页 > 解决方案 > 具有运行时参数的 Dockerfile 入口点未按预期工作

问题描述

我对 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

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

标签: dockerdocker-entrypoint

解决方案


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

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"

推荐阅读