【问题标题】:Understanding the difference in sequence of ENTRYPOINT/CMD between Dockerfile and docker run了解Dockerfile和docker run在ENTRYPOINT/CMD顺序上的区别
【发布时间】:2017-09-08 10:33:39
【问题描述】:

Docker 新手在这里...

我正在尝试从 Dockerfile 构建和运行 IBM DataPower 容器,但它似乎与仅运行 docker run 并在终端中传递相同参数时的工作方式不同。

这行得通 (docker run)

docker run -it \
  -v $PWD/config:/drouter/config \
  -e DATAPOWER_ACCEPT_LICENSE=true \
  -e DATAPOWER_INTERACTIVE=true \
  -e DATAPOWER_WORKER_THREADS=4 \
  -p 9090:9090 \
  --name mydatapower \
  ibmcom/datapower

...关键部分是它挂载了./config 文件夹,并且自定义配置由容器中运行的datapower获取。

这不是 (Dockerfile)

Dockerfile:

FROM ibmcom/datapower

ENV DATAPOWER_ACCEPT_LICENSE=true
ENV DATAPOWER_INTERACTIVE=true
ENV DATAPOWER_WORKER_THREADS=4

EXPOSE 9090

COPY config/auto-startup.cfg /drouter/config/auto-startup.cfg

构建:

docker build -t local/datapower .

运行:

docker run -it \
  -p 9090:9090 \
  --name mydatapower local/datapower

问题在于 DataPower 没有选择 auto-startup.cfg 文件,因此没有使用其他配置选项。我知道源文件路径是正确的,因为如果我拼错文件名 docker 会抛出错误。

我有一个理论,它可能在配置文件可用之前运行继承的 ENTRYPOINT 或 CMD。我不知道如何测试或证明这一点。我不知道ENTRYPOINT或CMD是什么,因为继承的图像不是开源的,我不知道如何找到它。

这看起来有可能吗?

更新:

auto-startup.cfg的内容是:

top; co

ssh

web-mgmt
  admin enabled
  port 9090
exit

它只是启用 DataPower WebGUI。

在命令行中运行时的输出:

docker run -it -v $PWD/config:/drouter/config -v $PWD/local:/drouter/local -e DATAPOWER_ACCEPT_LICENSE=true -e DATAPOWER_INTERACTIVE=true -e DATAPOWER_WORKER_THREADS=4 -p 9091:9090 --name myconfigureddatapower ibmcom/datapower`

...包含以下内容:

20170908T121729.015Z [0x8100006e][system][notice] : Executing startup configuration.
20170908T121729.970Z [0x00350014][mgmt][notice] web-mgmt(WebGUI-Settings): tid(303): Operational state up

...但是Dockerfile 没有。这就是为什么我认为配置文件可能被复制到位太晚了。

我尝试将CMD ["/bin/drouter"] 添加到我的 Dockerfile 的末尾,但无济于事。

【问题讨论】:

  • 您可以使用docker image inspect <imagename> 查找现有图像的ENTRYPOINTCMD
  • 谢谢@larsks :)

标签: docker dockerfile ibm-datapower


【解决方案1】:

我已经测试了您的 Dockerfile,它似乎可以正常工作。我的auto-startup.cfg 文件被复制到正确的位置,当我启动容器时,它正在读取文件。

我得到这个输出:

[root@ip-172-30-2-164 tmp]# docker run  -ti -p 9090:9090  test
20170908T123728.818Z [0x8040006b][system][notice] logging target(default-log): Logging started.
20170908T123729.067Z [0x804000fe][system][notice] : Container instance UUID: 36bcca0e-6139-4694-91b0-2b7b66c3a498, Cores: 4, vCPUs: 4, CPU model: Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz, Memory: 16049.1MB, Platform: docker, OS: dpos, Edition: developers-limited, Up time: 0 minutes
20170908T123729.071Z [0x8040001c][system][notice] : DataPower IDG is on-line.
20170908T123729.071Z [0x8100006f][system][notice] : Executing default startup configuration.
20170908T123729.416Z [0x8100006d][system][notice] : Executing system configuration.
20170908T123729.417Z [0x8100006b][mgmt][notice] domain(default): tid(8143): Domain operational state is up.
708f98be1390
Unauthorized access prohibited.
20170908T123731.239Z [0x806000dd][system][notice] cert-monitor(Certificate Monitor): tid(399): Enabling Certificate Monitor to scan once every 1 days for soon to expire certificates
20170908T123731.552Z [0x8100006e][system][notice] : Executing startup configuration.
20170908T123732.436Z [0x8100003b][mgmt][notice] domain(default): Domain configured successfully.
20170908T123732.449Z [0x00350014][mgmt][notice] web-mgmt(WebGUI-Settings): tid(303): Operational state up
login: 

要检查您的文件是否已复制到容器中,您可以运行docker run -ti local/datapower sh 进入容器,然后检查/drouter/config/ 的内容。

你的基础镜像命令是:CMD ["/bin/drouter"]你可以检查它是否运行docker history ibmcom/datapower

更新:

容器中的drouter 用户必须能够读取auto-startup.cfg 文件。你有两个选择:

  • 使用适当的权限 (chmod 644 config/autostart.cfg) 设置您的本地 auto-startup.cfg
  • 或在 Dockerfile 中添加这些行,以便drouter 可以读取文件:

    USER root
    RUN chown drouter /drouter/config/auto-startup.cfg
    USER drouter
    

【讨论】:

  • 非常感谢!这已经很有帮助,但仍然无法正常工作。请在 OP 上查看日志输出的更新。
  • @hofnarwillie 我用运行图像时得到的日志更新了答案。
  • 这很奇怪。我没有收到web-mgmt(WebGUI-Settings): tid(303): Operational state up。在容器内运行外壳时,我得到:$ cat drouter/config/auto-startup.cfg > cat: can't open 'drouter/config/auto-startup.cfg': Permission denied
  • 另外,运行 $ ls drouter/config/auto-startup.cfg 会返回 -rw------- 1 root root
  • 嗯,我的返回 -rw-r--r-- 1 root root 看起来这里发生了一些事情。这很奇怪,因为我们使用的是相同的 Dockerfile(我使用的正是您在问题中提供的内容)。
猜你喜欢
  • 2016-09-24
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 2019-02-09
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
相关资源
最近更新 更多