从 docker compose 在容器中运行脚本?

时间:2021-02-20 01:52:01

标签: docker docker-compose

尝试通过 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?)

2 个答案:

答案 0 :(得分:1)

commanddocker-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

版本 3 语法

version: "3"
services:
  test:
    build: .
    volumes:
      - /home/test/script.sh:/script.sh
    command: ["/bin/sh", "/script.sh"]

答案 1 :(得分:0)

大概这个容器会做一些事情,而不仅仅是安装一些包并终止,不是吗?如果是这种情况,您最好使用 dockerfile 并按照您希望的方式构建映像,然后在撰写文件中使用该新映像。

如果映像已经定义了 ENTRYPOINT,则运行脚本来安装包作为您在撰写文件中的 command: 可能不起作用,即使您让它工作,安装脚本也会运行,然后容器完成后将终止。

相关问题