问题描述
使用Packer创建了一个Docker镜像,模板中定义了构建器和配置信息。构建器部分如下所示:
{
"builders": [
{
"type": "docker",
"image": "ubuntu:latest",
"export_path": "image.tar",
"changes": [
"USER test",
"WORKDIR /tmp",
"VOLUME /data",
"EXPOSE 21 22",
"CMD sudo myprogram"
]
}
]
}
在运行Packer时,输出的结果是一个image.tar
文件。然后可以通过docker import image.tar
导入该镜像,并使用docker run -p 21:21 -it --rm 52c0b0362362 bash
命令启动容器。
用户希望每次启动镜像时都自动执行sudo myprogram
命令。然而,尽管模板验证成功,但似乎并没有生效。用户还尝试将CMD sudo myprogram
更改为ENTRYPOINT sudo myprogram
,但也没有成功。用户想知道如何确保每次启动镜像时都自动执行该命令,并且该命令必须以root/sudo身份运行。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
根据回答1,你可以使用ENTRYPOINT
来实现自动执行sudo myprogram
命令。这将使sudo myprogram
成为默认命令,然后CMD
可以作为默认命令(sudo myprogram
)的”附加参数”。
以下是一个可行的示例:
# build.json
{
"builders": [
{
"type": "docker",
"image": "ubuntu:latest",
"commit": true,
"changes": [
"ONBUILD RUN apt-get -q update",
"ONBUILD RUN apt-get install -y -q htop",
"ENTRYPOINT [\"top\"]"
]
}
]
}
在上面的示例中,我们使用ENTRYPOINT
将sudo myprogram
设置为默认命令,并且CMD
可以作为默认命令的”附加参数”。你可以根据自己的需求修改示例中的命令。
另一种解决方案是保留CMD [\"sudo myprogram\"]
指令,但在运行镜像时不添加命令:docker run -it --rm HASH_ID
。
方案2
根据回答2,你可以使用docker import
命令导入镜像时,通过--change 'CMD ["somecommand"]'
来设置CMD指令。例如:
docker import --change 'CMD ["bash"]' image.tar
然后,当运行docker run
命令时,会打开一个shell:
docker run -it b604fa244510
root@69df4b3f48a2:/
这样就可以避免docker run -p 21:21 -it --rm 02163a32f3b7
命令无法执行的问题。
请注意,以上解决方案中的命令和示例仅供参考,你需要根据自己的实际情况进行调整。
以上是关于如何在使用Packer创建的Docker容器中运行CMD命令的解决方案。希望对你有帮助!