Як отримати докер-композицію, щоб завжди заново створювати контейнери зі свіжих зображень?


200

Мої докерські зображення побудовані на сервері Дженкінс CI і передаються до нашого приватного реєстру докерів. Моя мета - забезпечення середовища з докер-композицією, яка завжди запускає спочатку побудований стан зображень.

На даний момент я використовую докер-композит 1.3.2, а також 1.4.0 на різних машинах, але ми також раніше використовували старіші версії.

Я завжди використовував docker-compose pull && docker-compose up -dкоманди, щоб отримати свіжі зображення з реєстру та запустити їх. Я вважаю, що моя краща поведінка працювала так, як очікувалося до певного моменту часу, але відтоді docker-compose upпочала повторно запускати раніше зупинені контейнери замість того, щоб щоразу запускати спочатку побудовані зображення.

Чи є спосіб позбутися такої поведінки? Чи може це бути таким, який з'єднаний у файлі конфігурації docker-compose.yml, щоб не залежати від того, щоб "не забути" щось у командному рядку при кожному виклику?

пс. Окрім пошуку способу досягнення своєї мети, я також хотів би дізнатися трохи більше про тло такої поведінки. Я думаю, що основна ідея Докера - побудувати незмінну інфраструктуру. Поточна поведінка докер-композиту просто здається явною сутичкою з таким підходом .. чи я пропускаю тут деякі моменти?

Відповіді:


234

docker-compose up --force-recreateце один варіант, але якщо ви використовуєте його для CI, я б розпочав збірку, docker-compose rm -fщоб зупинити та видалити контейнери та томи (потім слідкуйте за нею з підтягуванням).

Це те, що я використовую:

docker-compose rm -f
docker-compose pull
docker-compose up --build -d
# Run some tests
./tests
docker-compose stop -t 1

Причиною відтворення контейнерів є збереження будь-яких обсягів даних, які можуть бути використані (і це також відбувається upнабагато швидше).

Якщо ви робите CI, ви цього не хочете, тож просто видалити все, що ви хочете, хочете.

Оновлення: використання, up --buildдодане в docker-compose1.7


1
Так, насправді це я і роблю в КІ. Не знаю, чому я цього не згадував ...
Адріан Муат

@dnephin docker-compose run -dне існує? Ви хочете сказати " docker-compose up -dні"?
Гійом Вінсент

2
якщо бігти docker-compose pullраніше, docker-compose rm -fви можете зекономити ще більше часу
stephanlindauer

2
Що в кінці робити прапор -d?
Девід Дж. Девіс

3
"-d Окремий режим: запускайте контейнери у фоновому режимі",
денфін

137

Єдине рішення, яке працювало для мене, це:

docker-compose build --no-cache

Це автоматично витягне свіже зображення з репо і не буде використовувати кеш-версію, попередньо встановлену з будь-якими параметрами, якими ви користувалися раніше.


1
Крім того, у Windows 10 це може допомогти встановити DNS-сервер у налаштуваннях від Автоматичне до Фіксованого або З Фіксованого до Автоматичного.
qräbnö

2
Працював для мене над будівлею ОС X з docker-comopse версії 2.
RoboBear,

1
Працював на докері OS X.
HelloWorld

56

Згідно з поточною офіційною документацією , це короткий скорочення, яке зупиняє та видаляє контейнери, мережі, томи та зображення, створені вгору, якщо вони вже зупинені або частково видалені тощо.

docker-compose down

Тоді якщо у вас є нові зміни на ваших зображеннях або Dockerfiles, використовуйте:

docker-compose build --no-cache

Нарешті:docker-compose up

В одній команді: docker-compose down && docker-compose build --no-cache && docker-compose up


2
docker-compose build --no-cacheпотрібен лише за наявності змін на Dockerfiles.
Віктор Тимофтій

Справді, Віктор. Дякую! Я вважав, що це також необхідно після оновлення модуля / програми, що виконується при запуску контейнера. У цих випадках, перш ніж запустити docker-compose up, необхідно відновити послуги docker-compose build.
ivanleoncz

18

Ви можете перейти --force-recreateдо docker compose up, де слід використовувати свіжі контейнери.

Я думаю, що аргументація повторного використання контейнерів полягає у збереженні будь-яких змін під час розробки. Зауважте, що Compose робить щось подібне з томами, які також зберігатимуться між відтворенням контейнерів (відтворений контейнер додаватиметься до обсягів свого попередника). Це може бути корисно, наприклад, якщо у вас є контейнер Redis, який використовується як кеш, і ви не хочете втрачати кеш кожного разу, коли вносите невеликі зміни. В іншому випадку це просто заплутано.

Я не вірю, що ви можете змусити це з файла Compose.

Можливо, це суперечить принципам непорушної інфраструктури. Контраргумент, ймовірно, ви не використовуєте Compose у виробництві (поки). Крім того, я не впевнений, що я згоден, що незмінна інфраструктура є основною ідеєю Docker, хоча це, безумовно, хороший випадок використання / точка продажу.


Дякую за відповідь. Думаю, було б дуже корисно примусити її на рівні конфігурації, наприклад. щоб застосувати його до контейнера бази даних та відключити відтворення за замовчуванням для контейнерів додатків ..
Kristof Jozsa

8
--force-recreateне працює для мене ... Зображення не витягується, навіть якщо там є новіша версія ...
lisak

1
@lisak Я ніколи не говорив, що це потягло нові образи. Це не так. Він просто запускає нові контейнери, використовуючи будь-яке зображення, наявне на місцях. Вам потрібно запустити витягування докера вручну.
Адріан Муат

3
docker-compose up --build

АБО

docker-compose build --no-cache

1
Коли це можливо, намагайтеся надати додаткове пояснення замість просто коду. Такі відповіді, як правило, є більш корисними, оскільки допомагають членам спільноти, а особливо новим розробникам краще розуміти обґрунтування рішення, а також можуть запобігти необхідності вирішувати подальші запитання.
Раджан

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.