docker - “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”。
这可能吗?
不太理想,但如果上述情况不可行 - 是否有另一种方法可以将文件添加到现有容器映像中以达到预期结果?
解决方案
它与“如何在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
在您的情况下,您可能会遇到执行二进制文件的问题。
- 您需要验证是否为目标体系结构编译了二进制文件。
- 检查是否在环境中找到所需的库。
推荐阅读
- string - 从文件读取时将空字符串更改为“Nostring”
- xamarin.forms - 如何实现一个本机图像查看器,用捏来放大 Xamarin.Forms?
- android - Android资源未找到异常oncreate
- java - Android - 使用时区转换当前日期和时间
- php - 如何根据当前登录android的用户检索数据
- laravel - 更新 Laravel Illuminate 集合中的单个键值
- selenium - Selenium:PhantomJS:网站呈现为移动网站
- qt - 向模拟时钟添加滴答声
- mysql - 从 VM 实例访问远程 MySQL 数据库
- scheduled-tasks - 如何在另一个环境中运行 odoo 自动调度(cron 作业)