在启动时不运行任何进程的Docker容器中运行命令

8aqjt8rx  于 2023-01-25  发布在  Docker
关注(0)|答案(2)|浏览(192)

我有一个基于映像的Docker容器,默认情况下,* 启动时不运行任何命令 *。我需要在该容器中执行命令。
运行docker run -it [container tag]可以运行,但存在两个问题:
1.它运行在交互模式下(正如人们所期望的那样),而我需要的是可以在服务器上运行的东西,没有人的监督。
1.在执行需要运行的命令之前,我需要执行docker cp命令。
基本上,我得到的是:

  • docker create创建容器。
  • docker cp移过我需要的文件。
  • docker start启动容器,但由于它没有要运行的默认命令,因此立即退出。
  • docker exec拒绝运行我的命令,因为容器被停止了。再多的docker start也无法修复这个问题。
    我无法编辑图像Dockerfile,因此不幸的是,无法添加while true; done(此处建议)作为要运行的默认命令。

我假设已经存在一个将startexec背靠背链接起来的命令(并确保容器在命令运行之前不会关闭,类似于runcreate-start-attach),但我似乎在文档和其他论坛答案中都找不到任何东西。

xfb7svmp

xfb7svmp1#

您可以直接将需要复制的文件所在的目录挂载到容器中,然后运行所需的命令。在本例中,我只运行ls,但我也可以运行脚本本身

    • 示例文件**
#!/bin/bash
echo "running this on $(hostname)"
date
echo "ending....."
$ docker run -v $(pwd)/scripts:/myscripts ubuntu ls -lrt ./myscripts/stack.sh
-rwxrwxrwx 1 root root 70 Jan 24 05:43 ./myscripts/stack.sh

$ docker run -v $(pwd)/scripts:/myscripts ubuntu ./myscripts/stack.sh
running this on 63b65348373a
Tue Jan 24 05:44:22 UTC 2023
ending.....

在这两种情况下,我实际上都是将脚本挂载到容器映像中,然后使用已挂载的文件运行命令。

dtcbnfnu

dtcbnfnu2#

@Hans Kilian的评论让我想起了传递给docker run的参数(在图像之后)是入口点的替换,因此,如果我有一个默认情况下没有入口点的图像,我可以简单地运行:

docker run -d [image] sleep infinity

...它将启动容器,但进程不会退出。
之后,我可以自由地运行任意数量的docker cpdocker exec

相关问题