Запустить скрипт в контейнере из docker compose?

#docker #docker-compose

#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: фатальный: невозможно выполнить bash /home/install-extra-stuff.sh : Нет такого файла или каталога сегодня в 6:10 вечера [cmd] bash /home/install-extra-stuff.sh вышедший 127

Сам скрипт содержит:

 #!/bin/bash

# Ping
apt-get update amp;amp; apt install iputils-ping -y
 

Переход в сам контейнер и выполнение этих команд после его запуска с закомментированными строками, приведенными выше, отлично устанавливает пакет.

Есть идеи (кроме использования a dockerfile ?)

Комментарии:

1. Извините, если вы уже пробовали это. Вы пробовали другой формат команды? Я не уверен, что это соответствует спецификации . Возможно, попробуйте: - ["bash", "/home/install-extra-stuff.sh"] или - bash /home/install-extra-stuff.sh

2. Не похоже, что Dockerfile действительно более сложный, чем то, что вы показали здесь; основные отличия заключаются в том, что необходимо поместить FROM строку в начало файла и RUN перед apt-get ... командой. Почему бы не использовать это?

Ответ №1:

При command запуске в docker-compose.yml нем передается образу, sh -c command поэтому, если command является строкой 'bash /home/install-extra-stuff.sh' , оболочка не будет правильно проанализирована.

Я бы предложил вместо этого удалить 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"]
 

Ответ №2:

предположительно, этот контейнер собирается сделать что-то другое, чем просто установить некоторые пакеты и завершить работу, не так ли? Если это так, вам будет намного лучше использовать dockerfile и создать изображение так, как вы хотите, а затем использовать это новое изображение в вашем файле компоновки.

Запуск скрипта для установки пакетов от вашего command: имени в файле compose может не сработать, если в образе уже определена ТОЧКА входа, и даже если вы заставите его работать, сценарий установки будет запущен, а затем контейнер завершится, когда это будет сделано.

Ответ №3:

Это мое предложение:

 services:
  replicaset-setup:
    container_name: replicaset-setup
    image: mongo:4.4.4
    restart: "no"
# option 1:
#    entrypoint: [ "bash", "-c", "sleep 20 amp;amp; /scripts/setup.sh" ]
# option 2:
    command: bash -c "
      sleep 20 amp;amp;
      chmod  x /scripts/setup.sh amp;amp;
      scripts/setup.sh"
    volumes:
      - ./rs-script/setup.sh:/scripts/setup.sh