理解Dockerfile和docker run之间ENTRYPOINT / CMD的顺序差异
Docker noob在这里…
我试图从一个Dockerfile构build和运行一个IBM DataPower容器,但它看起来没有像运行docker run
并在terminal中传递相同的参数那样工作。
这工作( 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
文件夹,自定义configuration由在容器中运行的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
build立:
docker build -t local/datapower .
跑:
docker run -it \ -p 9090:9090 \ --name mydatapower local/datapower
问题是DataPower没有selectauto-startup.cfg
文件,所以额外的configuration选项没有被使用。 我知道源文件path是正确的,因为如果我拼错文件名docker引发错误。
我有一个理论,它可能会在configuration文件可用之前运行inheritance的ENTRYPOINT或CMD。 我不知道如何testing或certificate这一点。 我不知道ENTRYPOINT或CMD是什么,因为inheritance的图像不是开源的,我不知道如何find它。
这似乎有可能吗?
更新:
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
它不。 这就是为什么我认为configuration文件可能被复制到位的原因。
我已经尝试添加CMD ["/bin/drouter"]
到我的Dockerfile结束无济于事。
我已经testing了你的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
来input容器,然后检查/drouter/config/
。
您的基本映像命令是: CMD ["/bin/drouter"]
您可以检查它运行docker history ibmcom/datapower
。
更新:
容器中的drouter
用户必须能够读取auto-startup.cfg
文件。 你有2个选项:
- 用适当的权限(
chmod 644 config/autostart.cfg
)设置你的本地auto-startup.cfg
。 -
或者将这些行添加到Dockerfile中,以便
drouter
可以读取该文件:USER root RUN chown drouter /drouter/config/auto-startup.cfg USER drouter