首页 > 解决方案 > “docker run” 位于已安装卷中的命令

问题描述

有没有办法让 docker 在创建容器时执行位于已安装卷中的命令?

我有一个简单的 c 程序位于一个目录中,我正在绑定安装到输出 pwd 的容器,然后运行直到被杀死:

flash@dsvm1:~$ ./hello-docker-mount
Hello from /home/flash!
^C
flash@dsvm1:~$ cat hello-docker-mount.c
#include <stdio.h>
#include <unistd.h>
int main()
{
        char cwd[1024];
        getcwd(cwd, sizeof(cwd));
        printf("Hello from %s!\n", cwd);
        for(;;) { sleep(1); }
}
flash@dsvm1:~$ ls /home/flash/hello-docker-mount -al
-rwxrwxr-x 1 flash flash 8728 May 21 22:53 /home/flash/hello-docker-mount

但是,当我尝试使用它作为命令“docker run”时,它似乎失败了,就好像在执行命令后发生了挂载一样:

flash@dsvm1:~$ docker run -it --name foo --rm -v /home/flash:/home/flash busybox /home/flash/hello-docker-mount
standard_init_linux.go:195: exec user process caused "no such file or directory"
flash@dsvm1:~$ docker run -it --name foo --rm -v /home/flash:/home/flash -w /home/flash busybox /home/flash/hello-docker-mount
standard_init_linux.go:195: exec user process caused "no such file or directory"
flash@dsvm1:~$ docker run -it --name foo --rm -v /home/flash:/home/flash -w /home/flash busybox ./hello-docker-mount
standard_init_linux.go:195: exec user process caused "no such file or directory"
flash@dsvm1:~$ docker run -it --name foo --rm -v /home/flash:/home/flash -w /home/flash busybox hello-docker-mount
docker: Error response from daemon: OCI runtime create failed: container_linux.go:296: starting container process caused "exec: \"hello-docker-mount\": executable file not found in $PATH": unknown.

我也尝试了--entrypoint:

flash@dsvm1:~$ docker run -it --name foo --rm -v /home/flash:/home/flash --entrypoint /home/flash/hello-docker-mount busybox
standard_init_linux.go:195: exec user process caused "no such file or directory"
flash@dsvm1:~$ docker run -it --name foo --rm -v /home/flash:/home/flash -w /home/flash --entrypoint hello-docker-mount busybox
docker: Error response from daemon: OCI runtime create failed: container_linux.go:296: starting container process caused "exec: \"hello-docker-mount\": executable file not found in $PATH": unknown.

如果我首先调用映像中的可执行文件,我可以看到该文件:

flash@dsvm1:~$ docker run -it --name foo --rm -v /home/flash:/home/flash -w /home/flash busybox ls -l hello-docker-mount
-rwxrwxr-x    1 1003     1003          8728 May 21 22:53 hello-docker-mount

我无法控制用户将在他们的 docker 镜像中构建什么,因此无法保证任何特定的 shell 或可执行文件都可用。我需要能够“docker run -d”他们的图像并确保它继续运行,以便当用户想要与之交互时我可以使用“docker exec”。

这可能吗?

不太理想,但如果上述情况不可行 - 是否有另一种方法可以将文件添加到现有容器映像中以达到预期结果?

标签: docker

解决方案


它与“如何在busybox中执行二进制”有关。

“docker run”在执行命令之前挂载卷。

例如,这适用于 centos:

docker run -v /home/chan:/home/chan centos /home/chan/echo.sh
hello world

要验证您是否可以在busybox中执行二进制文件,您可以执行

docker run -it -v /Users/nnatara/Desktop:/home/chan busybox sh
/ # cd /home/chan/
/home/chan # ./echo.sh
hello world

在您的情况下,您可能会遇到执行二进制文件的问题。

  • 您需要验证是否为目标体系结构编译了二进制文件。
  • 检查是否在环境中找到所需的库。

推荐阅读