LINUX.ORG.RU

docker-compose build без контейнера

 


0

1

Всем привет! Возник тут вопрос при использовании docker-compose. Допустим, я взял за основу образ CentOS, доработал его чуток под себя (в рамках dockerfile). И создаю контейнер на основе этого образа. То есть у меня будет что-то вроде такого:

services:
  centos79:
    build:
      context: ~/win/centos-7.9
      dockerfile: Dockerfile
    image: local/centos-7.9:latest

  local-php-fpm-74:
    container_name: php74
    build:
      context: ~/win/php-fpm
      dockerfile: Dockerfile
    depends_on:
      - centos79

Мне это нужно, чтобы при запуске docker-compose up –build у меня собирались оба образа. При этом образ второго контейнера базируется на первом образе. Проблема в том, что контейнер-то мне нужен только один - второй (в данном примеер php-fpm), а вот первый нет. А при таком синтаксисе создаётся всегда два контейнера. Можно ли каким-то синтаксисом обозначить, что второй образ зависит от первого, поэтому при build’е нужно сначала собирать первый. А при запуске через up контейнер нужен только один. Не могу нигде найти.

Ответ на: комментарий от anonymous

Вроде это не то. Мне не нужно использовать несколько баз. Я занимаюсь разработкой скриптов сборки, поэтому оч. часто собираю все образы, запускаю контейнеры, тестирую, потом прибиваю контейнеры, их образы и после правки скриптов-сборщиков повторяю процесс заново. Т.е. я постоянно использую команды:

docker-compose up -d --build # для сборки образов, создания и запуска на их основе контейнеров
docker-compose down --rmi=all # для остановки контейнеров, их удаления и удаления связанных с ними образов.

Так вот мне нужно, чтобы при запуске первой команды нужный мне базовый образ CentOS’а собирался, но на его основе контейнер не создавался.

Но промежуточный базовый образ CentOS’а как отдельный образ именно нужен, потому что на его основе ещё другие образы и контейнеры подвязаны.

Novascriptum
() автор топика
Последнее исправление: Novascriptum (всего исправлений: 3)
11 апреля 2021 г.
Ответ на: комментарий от Novascriptum

docker-compose служит для деплоя сервисов, а не для сборки образов, поэтому контейнер будет создаваться всегда. Он просто попытается запуститься и остановится, если в нем нет служб. Просто не следует устанавливать политику перезапуска (по умолчанию контейнеры не перезапускаются).

Я выхожу из ситуации тем, что эталонный образ готовлю из rootfs, а CMD или ENTRYPOINT не указываю. Да, контейнер будет создан, но и только. Поэтому с вашим docker-compose.yml все в порядке, больше ничего с ним не придумаешь.

Ну или второй вариант: отдельно создать образ, задеплоить его на docker hub и тянуть уже оттуда. По мне - так самое то. И незачем пилить костыли.

Кстати, для вычищения шлака, в том числе и остановленных контейнеров, я использую такой вот нехитрый скрипт:

#!/bin/bash

stopped=`docker ps -q --filter "status=exited"`
untagged=`docker images -q --filter "dangling=true"`

found=0

if [ ! -z "${stopped}" ]; then
    echo 'Removing stopped containers...'
    echo ${stopped} | xargs --no-run-if-empty docker rm
    found=1
fi;

if [ ! -z "${untagged}" ]; then
    echo 'Removing untagged images...'
    docker rmi ${untagged}
    found=1
fi;

if [ ${found} == 1 ]; then
    echo 'Zombie removed.'
    exit 0
fi

echo 'No zombie found!'
chapvic
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.