尝试通过 compose 将一些小包安装到容器中,而不必使用我自己的 dockerfile
,但是我是否尝试仅安装文件夹并调用脚本,例如:
volumes:
- '/opt/docker/configs/extras:/home'
command:
- 'bash /home/install-extra-stuff.sh'
或者直接挂载文件并调用它,比如:
volumes:
- '/opt/docker/configs/extras/install-extra-stuff.sh:/home/install-extra-stuff.sh'
command:
- 'bash /home/install-extra-stuff.sh'
我收到文件不存在的错误
<块引用>ifelse:fatal: 无法执行 bash /home/install-extra-stuff.sh: 没有那个文件或目录 今天下午 6:10 [cmd] bash /home/install-extra-stuff.sh 退出 127
脚本本身包含:
#!/bin/bash
# Ping
apt-get update && apt install iputils-ping -y
跳入容器本身并在上面注释掉的那些行开始后运行这些命令,安装包就好了。
任何想法(除了使用 dockerfile
?)
答案 0 :(得分:1)
当 command
在 docker-compose.yml
中运行时,它作为 sh -c command
传递给图像,因此如果命令是字符串 'bash /home/install-extra-stuff.sh'
,shell 将无法正确解析.
如果这是一个选项,我建议改为删除 bash
:
command:
- /home/install-extra-stuff.sh
或者如果您可以将 docker-compose 转换为使用第 3 版语法:
command: ["bash", "/home/install-extra-stuff.sh"]
以下是在运行 script.sh
时正确运行测试脚本 docker-compose up --build
的最小示例。
services:
test:
build: .
volumes:
- /home/test/script.sh:/script.sh
command:
- /script.sh
version: "3"
services:
test:
build: .
volumes:
- /home/test/script.sh:/script.sh
command: ["/bin/sh", "/script.sh"]
答案 1 :(得分:0)
大概这个容器会做一些事情,而不仅仅是安装一些包并终止,不是吗?如果是这种情况,您最好使用 dockerfile 并按照您希望的方式构建映像,然后在撰写文件中使用该新映像。
如果映像已经定义了 ENTRYPOINT,则运行脚本来安装包作为您在撰写文件中的 command:
可能不起作用,即使您让它工作,安装脚本也会运行,然后容器完成后将终止。