#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