使用Packer创建的Docker容器中如何运行CMD命令

99次阅读
没有评论

问题描述

使用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\"]"
            ]
        }
    ]
}

在上面的示例中,我们使用ENTRYPOINTsudo 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命令的解决方案。希望对你有帮助!

正文完