了解 Dockerfile 和 docker 运行 之间 ENTRYPOINT/CMD 顺序的差异
Understanding the difference in sequence of ENTRYPOINT/CMD between Dockerfile and docker run
Docker 菜鸟在这里...
我正在尝试从 Docker 文件构建和 运行 一个 IBM DataPower 容器,但它的工作方式似乎与刚刚 运行ning 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 运行ning 获取。
这不是 (Dockerfile
)
Docker文件:
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 会引发错误。
我有一个理论,它可能在配置文件可用之前 运行ning 继承的 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"]
添加到我的 Docker 文件的末尾,但没有成功。
我已经测试了您的 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"]
你可以查看运行ning docker history ibmcom/datapower
.
更新:
容器中的 drouter
用户必须能够读取 auto-startup.cfg
文件。您有 2 个选项:
- 为您的本地
auto-startup.cfg
设置适当的权限 (chmod 644 config/autostart.cfg
)。
或在 Dockerfile 中添加这些行,以便 drouter
可以读取文件:
USER root
RUN chown drouter /drouter/config/auto-startup.cfg
USER drouter
Docker 菜鸟在这里...
我正在尝试从 Docker 文件构建和 运行 一个 IBM DataPower 容器,但它的工作方式似乎与刚刚 运行ning 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 运行ning 获取。
这不是 (Dockerfile
)
Docker文件:
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 会引发错误。
我有一个理论,它可能在配置文件可用之前 运行ning 继承的 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"]
添加到我的 Docker 文件的末尾,但没有成功。
我已经测试了您的 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"]
你可以查看运行ning docker history ibmcom/datapower
.
更新:
容器中的 drouter
用户必须能够读取 auto-startup.cfg
文件。您有 2 个选项:
- 为您的本地
auto-startup.cfg
设置适当的权限 (chmod 644 config/autostart.cfg
)。 或在 Dockerfile 中添加这些行,以便
drouter
可以读取文件:USER root RUN chown drouter /drouter/config/auto-startup.cfg USER drouter