docker - 具有运行时参数的 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
每次我重复这个过程都会发生同样的事情,所以我的问题是,为什么?这两个命令有什么区别。我的印象是它们完全一样。
解决方案
如果以后有人遇到这个问题,我就是这样解决的。
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"
推荐阅读
- javascript - Javascript 对象引用了最后一个对象而不是自身
- reactjs - 以常规方法表示法反应 this.setState
- php - 在我的 php 代码中验证和使用 Google 的 BigQuery
- php - 使用 php 以编程方式进行 bigquery 表分区
- numpy - Tensorflow:如何在没有np.where的情况下根据条件随机选择元素?
- java - Java Mockito 与 RestTemplate.exchange 使用泛型
- spring - 我从 Maven 收到一条错误消息,说“有测试失败”,但我没有写任何测试失败
- jquery - 在jQuery中的另一个值之后获取数组值
- arrays - Swift - 将对象数组保存到核心数据,检索时只取回一个对象
- php - iCalendar 脚本在 Outlook 中呈现为 html