有没有办法让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
然而,当我尝试&#34; docker run&#34;使用它作为命令它似乎失败,好像在执行命令后发生了挂载:
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或可执行文件可用。我需要能够&#34; docker run -d&#34;他们的形象并确保它继续运行,以便当用户想要与之互动时,我可以使用&#34; docker exec&#34;。
这可能吗?
不太理想,但如果上述情况不可行 - 是否有另一种方法可以将文件添加到现有容器图像中以达到预期效果?
答案 0 :(得分:4)
它与“如何在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
在您的情况下,您可能会遇到执行二进制文件的问题。