Урок 10. задачи, обратные данной — Математика — 2 класс
Математика, 2 класс
Урок № 10. Задачи, обратные данной
Перечень вопросов, рассматриваемых в теме:
- Что такое задачи, обратные данной?
- Как составлять и решать обратные задачи?
Глоссарий по теме:
Задачи, обратные данной — считаются те задачи, в которых говорится об одних и тех же предметах, но известное и неизвестное меняются местами.
Основная и дополнительная литература по теме урока (точные библиографические данные с указанием страниц):
1. Математика. 2 класс. Учебник для общеобразовательных организаций. В 2 ч. Ч.1/ М. И. Моро, М. А. Бантова, Г. В. Бельтюкова и др. –8-е изд. – М.: Просвещение, 2017. – с.26, 27
2. Математика. Проверочные работы. 2 кл: учебное пособие для общеобразовательных организаций/ Волкова А.Д.-М.: Просвещение, 2017, с. 16, 17
3. Математика. Рабочая тетрадь. 2 кл. 1 часть: учебное пособие для общеобразовательных организаций/ Волкова С.И.-М.: Просвещение, 2017.-с.31
Теоретический материал для самостоятельного изучения
Решим три задачи.
Составим по рисунку первую задачу.
В классе 10 девочек и 8 мальчиков. Сколько всего детей в классе?
Составим схематический рисунок.
Решим задачу:
10 + 8 = 18 (д.)
Ответ: 18 детей в классе.
Составим вторую задачу.
В классе 18 детей. Девочек 10, остальные-мальчики. Сколько мальчиков в классе?
Решим задачу:
18 – 10 = 8 (м.)
Ответ: 8 мальчиков в классе.
Составим третью задачу.
В классе 18 детей. Мальчиков 8, остальные — девочки. Сколько девочек в классе?
Решим задачу:
18 – 8 = 10 (д.)
Ответ: 10 девочек в классе.
Посмотрим еще раз на схемы к каждой задаче. Обратим внимание на то, что во всех задачах одинаковый сюжет, но то, о чем спрашивается в первой задаче стало известным во второй и третьей задачах, а узнать во второй задаче, сколько мальчиков и в третьей задаче сколько девочек в классе надо то, что известно в первой задаче.
Задачи, в которых известно то, о чем спрашивается в первой задаче и надо узнать то, что в первой задаче известно, называют обратными первой.
Сделаем вывод: задачи, обратные данной — считаются те задачи, в которых говорится об одних и тех же предметах, но известное и неизвестное меняются местами.
Тренировочные задания.
1. Решите задачу. Выберите задачи, обратные данной.
Кате подарили 8 воздушных шариков красного и синего цвета. Красных шариков было 5. Сколько синих шариков у Кати?
Варианты ответов:
1. Кате подарили 5 шариков красного цвета и 3 шарика синего цвета. Сколько шариков у Кати?
2. У Кати было 8 шариков. 3 шарика она подарила. Сколько шариков осталось у Кати?
3. Кате подарили 8 воздушных шариков красного и синего цвета. Синих шариков было 3. Сколько красных шариков у Кати?
Правильные варианты:
1. Кате подарили 5 шариков красного цвета и 3 шарика синего цвета. Сколько шариков у Кати?
3. Кате подарили 8 воздушных шариков красного и синего цвета. Синих шариков было 3. Сколько красных шариков у Кати?
2 . Восстановите пропуски в задачах.
1.В июне было 10 пасмурных дней и 20 ясных дней. Сколько дней в ________?
2. В июне ____ дней. Из них 10 дней были пасмурными. Сколько______ дней было в июне?
3. В июне 30 дней. Ясными были ____ дней. Сколько ____ дней было в июне?
Варианты ответов:
30, 20, ясных, пасмурных, июне
Правильный вариант:
1. В июне было 10 пасмурных дней и 20 ясных дней. Сколько дней в июне?
2. В июне 30 дней. Из них 10 дней были пасмурными. Сколько ясных дней было в июне?
3. В июне 30 дней. Ясными были 20 дней. Сколько пасмурных дней было в июне?
Реши задачи .составь задачи,обратные данным,и реши их Мальвина и Пьеро запасли для животных 6 кг семян арбуза и 8 кг
Чтобы приступить к выполнению задания, надо иметь представление об обратной задаче и решить данную задачу.Понятие обратной задачи
Рассмотрим понятие обратной задачи по отношению к прямой задаче.
- Задачу назовем обратной к прямой (данной) задаче, если искомое данной задачи, становится числовым данным обратной задачи, а одно из числовых данных прямой задачи, становится искомым в обратной задаче.
- Для запоминания: то, что было известно — становится неизвестным, а то, что было неизвестно — становится известным.
- Обратных задач можно составить столько, сколько числовых данных в прямой задаче (словесные формулировки могут быть различны).
Решение прямой задачи и составление обратных задач
Решим данную задачу, составим тексты обратных задач по краткой записи после их решения.
- Прямая задача. Мальвина и Пьеро запасли для животных 6 кг семян арбуза и 8 кг семян дыни. Сколько всего кг семян они запасли?
А. с. — 6 кг.
Д. с. — 8 кг.
Всего — ? кг. (этот вопрос можно поставить после обобщающей скобки справа).
Какое действие надо выполнить, чтобы узнать сколько всего семян?
6 + 8 = 14 (кг).
Ответ: 14 килограммов семян.
- Обратная задача 1.
А. с. — ? кг.
Д. с. — 8 кг.
Всего — 14 кг.
Если из всех семян уберём семена дыни, то какие семена останутся?
14 — 8 = 6 (кг).
Ответ: 6 килограммов семян арбуза.
Мальвина и Пьеро запасли для животных 14 кг семян арбуза и семян дыни. Из них 8 кг семян дыни. Сколько семян арбуза они запасли?
- Обратная задача 2.
А. с. — 6 кг.
Д. с. — ? кг.
Всего — 14 кг.
Если из всех семян уберём семена арбуза, то какие семена останутся?
14 — 6 = 8 (кг).
Ответ: 8 килограммов семян дыни.
Мальвина и Пьеро запасли для животных 14 кг семян арбуза и семян дыни. Из них 6 кг семян арбуза. Сколько семян дыни они запасли?
1В «Взаимно – обратные задачи» Составь и запиши тексты обратных задач к данным. А) На клумбе расцвел 31 тюльпан, 15 тюльпанов срезали. Сколько тюльпанов осталось на клумбе? Б) В вазе — 8 яблок и 7 груш. Сколько всего фруктов в вазе? | 2В «Взаимно – обратные задачи» Составь и запиши тексты обратных задач к данным. А) На столе — 9 огурцов и 5 редисок. Сколько всего овощей на столе? Б) Над полянкой летало 23 пчёлки, 9 пчёлок улетело. Сколько пчёлок осталось летать? |
1В «Взаимно – обратные задачи» Составь и запиши тексты обратных задач к данным. А) На клумбе расцвел 31 тюльпан, 15 тюльпанов срезали. Сколько тюльпанов осталось на клумбе? Б) В вазе — 8 яблок и 7 груш. Сколько всего фруктов в вазе? | 2В «Взаимно – обратные задачи» Составь и запиши тексты обратных задач к данным. А) На столе — 9 огурцов и 5 редисок. Сколько всего овощей на столе? Б) Над полянкой летало 23 пчёлки, 9 пчёлок улетело. Сколько пчёлок осталось летать? |
1В «Взаимно – обратные задачи» Составь и запиши тексты обратных задач к данным. А) На клумбе расцвел 31 тюльпан, 15 тюльпанов срезали. Сколько тюльпанов осталось на клумбе? Б) В вазе — 8 яблок и 7 груш. Сколько всего фруктов в вазе? | 2В «Взаимно – обратные задачи» Составь и запиши тексты обратных задач к данным. А) На столе — 9 огурцов и 5 редисок. Сколько всего овощей на столе? Б) Над полянкой летало 23 пчёлки, 9 пчёлок улетело. Сколько пчёлок осталось летать? |
1В «Взаимно – обратные задачи» Составь и запиши тексты обратных задач к данным. А) На клумбе расцвел 31 тюльпан, 15 тюльпанов срезали. Сколько тюльпанов осталось на клумбе? Б) В вазе — 8 яблок и 7 груш. Сколько всего фруктов в вазе? | 2В «Взаимно – обратные задачи» Составь и запиши тексты обратных задач к данным. А) На столе — 9 огурцов и 5 редисок. Сколько всего овощей на столе? Б) Над полянкой летало 23 пчёлки, 9 пчёлок улетело. Сколько пчёлок осталось летать? |
1В «Взаимно – обратные задачи» Составь и запиши тексты обратных задач к данным. А) На клумбе расцвел 31 тюльпан, 15 тюльпанов срезали. Сколько тюльпанов осталось на клумбе? Б) В вазе — 8 яблок и 7 груш. Сколько всего фруктов в вазе? | 2В «Взаимно – обратные задачи» Составь и запиши тексты обратных задач к данным. А) На столе — 9 огурцов и 5 редисок. Сколько всего овощей на столе? Б) Над полянкой летало 23 пчёлки, 9 пчёлок улетело. Сколько пчёлок осталось летать? |
1В «Взаимно – обратные задачи» Составь и запиши тексты обратных задач к данным. А) На клумбе расцвел 31 тюльпан, 15 тюльпанов срезали. Сколько тюльпанов осталось на клумбе? Б) В вазе — 8 яблок и 7 груш. Сколько всего фруктов в вазе? | 2В «Взаимно – обратные задачи» Составь и запиши тексты обратных задач к данным. А) На столе — 9 огурцов и 5 редисок. Сколько всего овощей на столе? Б) Над полянкой летало 23 пчёлки, 9 пчёлок улетело. Сколько пчёлок осталось летать? |
Обратные задачи / Задачи / Справочник по математике для начальной школы
- Главная
- Справочники
- Справочник по математике для начальной школы
- Задачи
- Обратные задачи
В обратной задаче одна из искомых величин становится известной, а одна из данных величин становится неизвестной.
Прямая задача:
У Тани было 3 зелёных шарика и 2 красных. Сколько всего шариков было у Тани?
Первая обратная задача:
У Тани было 5 шариков, 3 шарика были зелёными, а остальные красные. Сколько красных шариков было у Тани?
Ты видишь, что известная величина — красные шарики — стала неизвестной.
А неизвестная величина — общее количество шариков — стало известной.
Вторая обратная задача:
У Тани было 5 шариков, 2 шарика были красными, а остальные зелёные. Сколько зелёных шариков было у Тани?
Ты видишь, что известная величина — зелёные шарики — стала неизвестной.
А неизвестная величина — общее количество шариков — стало известной.
ТАКИЕ ЗАДАЧИ НАЗЫВАЮТСЯ ОБРАТНЫМИ.
Поделись с друзьями в социальных сетях:
Советуем посмотреть:
Образцы оформления задачи
Цена. Количество. Стоимость
Скорость, время, расстояние
Задачи
Правило встречается в следующих упражнениях:
1 класс
Страница 48. Урок 25, Петерсон, Учебник, часть 2
Страница 50. Урок 26, Петерсон, Учебник, часть 2
Страница 53. Урок 27, Петерсон, Учебник, часть 2
Страница 60. Урок 31, Петерсон, Учебник, часть 2
Страница 63. Урок 32, Петерсон, Учебник, часть 2
Страница 8. Урок 5, Петерсон, Учебник, часть 3
Страница 25. Урок 13, Петерсон, Учебник, часть 3
Страница 33. Урок 17, Петерсон, Учебник, часть 3
Страница 65. Урок 33, Петерсон, Учебник, часть 3
Страница 91. Повторение, Петерсон, Учебник, часть 3
2 класс
Страница 54, Моро, Волкова, Степанова, Бантова, Бельтюкова, Учебник, часть 1
Задание 119, Моро, Волкова, Рабочая тетрадь, часть 1
Страница 35, Моро, Волкова, Степанова, Бантова, Бельтюкова, Учебник, часть 2
Страница 58, Моро, Волкова, Степанова, Бантова, Бельтюкова, Учебник, часть 2
Страница 81, Моро, Волкова, Степанова, Бантова, Бельтюкова, Учебник, часть 2
Страница 92, Моро, Волкова, Степанова, Бантова, Бельтюкова, Учебник, часть 2
Страница 94, Моро, Волкова, Степанова, Бантова, Бельтюкова, Учебник, часть 2
Страница 98, Моро, Волкова, Степанова, Бантова, Бельтюкова, Учебник, часть 2
Страница 14, Моро, Волкова, Рабочая тетрадь, часть 2
3 класс
Страница 18, Моро, Волкова, Степанова, Бантова, Бельтюкова, Учебник, часть 1
Страница 20, Моро, Волкова, Степанова, Бантова, Бельтюкова, Учебник, часть 1
Страница 27, Моро, Волкова, Степанова, Бантова, Бельтюкова, Учебник, часть 1
Страница 38, Моро, Волкова, Степанова, Бантова, Бельтюкова, Учебник, часть 1
Страница 32, Моро, Волкова, Рабочая тетрадь, часть 1
Страница 64, Моро, Волкова, Рабочая тетрадь, часть 1
Страница 10, Моро, Волкова, Степанова, Бантова, Бельтюкова, Учебник, часть 2
Страница 71, Моро, Волкова, Степанова, Бантова, Бельтюкова, Учебник, часть 2
Страница 6, Моро, Волкова, Рабочая тетрадь, часть 2
Страница 21, Моро, Волкова, Рабочая тетрадь, часть 2
4 класс
Страница 11, Моро, Волкова, Степанова, Бантова, Бельтюкова, Учебник, часть 1
Страница 76, Моро, Волкова, Степанова, Бантова, Бельтюкова, Учебник, часть 1
Страница 87, Моро, Волкова, Степанова, Бантова, Бельтюкова, Учебник, часть 1
Страница 49, Моро, Волкова, Рабочая тетрадь, часть 1
Страница 68, Моро, Волкова, Рабочая тетрадь, часть 1
Страница 32, Моро, Волкова, Степанова, Бантова, Бельтюкова, Учебник, часть 2
Страница 44, Моро, Волкова, Степанова, Бантова, Бельтюкова, Учебник, часть 2
Страница 66, Моро, Волкова, Степанова, Бантова, Бельтюкова, Учебник, часть 2
Страница 99, Моро, Волкова, Степанова, Бантова, Бельтюкова, Учебник, часть 2
Страница 29, Моро, Волкова, Рабочая тетрадь, часть 2
© budu5.com, 2021
Пользовательское соглашение
Copyright
Задачи, обратные данной
- Вот незадача… Точнее, задача…
- Минус, к тебе можно зайти?
- Да, Плюс, заходи.
- Здравствуй, Минус. Ты чем это так расстроен?
- Понимаешь, наша царица-Математика задала мне задачу. А получилась прямо какая-то незадача. Я не понимаю, что мне делать. Может быть, ты мне поможешь разобраться?
- Конечно! Все, что в моих силах. Ну рассказывай!
- Вот прочитай задачу.
- На болото царевны-лягушки прилетело 8 стрел. Из них 5 стрел прилетели из тридевятого царства, а остальные — из тридесятого государства. Сколько стрел прилетело из тридесятого государства?
Ну и что же здесь трудного? Совсем простенькая задача!
- Задачка-то простенькая. Но царица-Математика приказала мне составить к этой задаче какие-то обратные. Я понимаю, что можно куда-нибудь пойти, а потом вернуться обратно. Или кому-нибудь что-то подарить, а потом потребовать эту вещь обратно. Но вот что такое обратные задачи…
- Ну, Минус, я от тебя такого не ожидал. Ничего себе — сначала подарить, а потом потребовать подарок обратно. То, что ты кому-то подарил, тебе уже не принадлежит. Это не твоя вещь, так что обратно ты требовать ее не имеешь право.
- Да ладно, я это знаю. Я просто неудачно пошутил. Давай все-таки поговорим про задачи, обратные данной.
- Для того, чтобы ты понял, что такое задачи, обратные данной, надо составить краткое условие к задаче. О чем говорится в задаче.
- О том, что на болото царевны-лягушки прилетели стрелы.
- Значит, задача про стрелы. Давай еще раз прочитаем задачу, найдем в ней числа и выделим главные, опорные слова, которые помогут составить краткое условие. Читай первое предложение.
- На болото царевны-лягушки прилетело восемь стрел.
- Так и пишем:
Читай дальше
- Из них 5 стрел прилетело из тридевятого царства. Но это тоже прилетело.
- Да…надо подумать… А-а, восемь — это всего прилетело, а пять — из тридевятого царства.
Читаем дальше.
- А остальные — из тридесятого государства. Остальные — это неизвестно сколько.
Читаю дальше: сколько стрел прилетело из тридесятого государства?
- Нам надо узнать, сколько стрел прилетело из тридесятого государства. Получается вот такая запись.
Ну, теперь давай решим эту задачу.
- Задачка-то простая, для первоклашек. Нам надо узнать ту часть всех стрел, которые прилетели из тридесятого государства. Это мы будем находить, конечно, с моим любимым знаком — минусом.
Ну вот, задача решена. А где же обратные задачи?
- А теперь давай посмотрим еще раз на краткое условие задачи. В ней было известно, сколько всего стрел прилетело и сколько прилетело из тридевятого царства. А узнать надо было, сколько прилетело из тридесятого государства. Теперь мы и это знаем.
А вот чтобы составить задачи, обратные данной, надо изменить условие задачи так, чтобы то, что в первой задаче было известным, в обратной задаче, наоборот, становилось неизвестным. А то, что было неизвестным, становилось известным.
Давай составим новую задачу, в которой неизвестным будет второе число — количество стрел, которые прилетели из тридевятого царства:
Задача: На болото царевны-лягушки прилетело 8 стрел. Из них 3 стрелы прилетели из тридесятого государства, а остальные — из тридевятого царства. Сколько стрел прилетело из тридевятого царства?
- Ну, и эту задачку решить очень легко. Опять известно, сколько всего стрел, и известна та часть стрел, которую прислали из тридесятого государства. А узнать надо ту часть стрел, которая прилетела из тридевятого царства. Часть, как обычно, находим вычитанием. Я, Минус, на посту. Получили:
Отлично! Спасибо, Плюсик! Ты, как всегда, меня выручаешь!
- Не спиши, Минус! Ведь мы составили только одну задачу, обратную данной. Но в задаче есть еще одно число, которое ни разу пока не было неизвестным.
- Ну да, не было неизвестным общее количество стрел.
- Записываем:
- На болото царевны-лягушки прилетело несколько стрел. Из них 5 стрел прилетело из тридевятого царства, 3 стрелы — из тридесятого государства. Сколько всего стрел прилетело царевне-лягушке?
В этой задаче известна часть стрел, прилетевшая из тридевятого царства. И та часть стрел, которая прилетела из тридесятого государства. Надо узнать, сколько всего стрел прилетело.
Э-э, да мне в этой задаче делать нечего. Твоя очередь, Плюс.
- Конечно, эта задача решается со знаком плюс, ведь известны части, а надо узнать целое, т.е., сколько всего. Получаем:
- Ничего себе! Была одна задача, а стало три!
- Ну, Минус, ты понял, что такое обратная задача?
- Кажется понял. В задачах, обратных данной, каждое число по очереди становится неизвестным.
- А сейчас без моей помощи попробуй составить такие обратные задачи. Вот тебе задача. Слушай:
Петя играл в боулинг. 7 раз он сбивал кегли, а 3 раза промахнулся. Сколько всего раз бросал шар Петя?
- Так, составляю краткое условие:
А можно слово всего я напишу не снизу, а объединю две строчки фигурной скобкой?
- Конечно, так даже понятнее будет.
- Ой-ёй-ёй, Плюс, здесь нужен ты, ведь надо узнать, сколько всего.
- Хорошо, получим:
- Теперь составляю обратные задачи.
В первой задаче неизвестным будет число удачных бросков, когда Петя сбивал кегли, а остальные числа будут известны.
Вот в этой задаче уже нужен я, Минус, так как надо узнать только часть брошенных шаров. Получаем:
А еще одна задача нужна?
- Да, конечно. В задаче три данных, значит и задач должно быть три — одна прямая и две обратных.
- Так-так. Еще неизвестным не было количество промахов. Изменяю краткое условие:
И опять здесь надо узнать часть бросков, поэтому задачу надо решать вычитанием. Получим:
- Молодец, Минус! Так как мы составляем обратные задачи?
- В задачах, обратных данной, по очереди каждое данное становится неизвестным. А еще я заметил, что обратные задачи являются проверкой первой задачи.
- Абсолютно верно. И не забудь, обычно задач столько, сколько данных в задаче, включая неизвестное.
- Теперь я все понял. Пойду доложу царице-Математике о том, что ее задание выполнено. Спасибо, Плюсик! Пока.
- До свидания, Минус! Удачи!
Урок математики 1 класс «Взаимообратные действия» | Уроки по Математике
Урок математики 1 класс «Взаимообратные действия»
22.02.2017 2538 403 Мукушева Динара СерикбаевнаПлан урока математики
Тема урока: Взаимообратные действия Школа: Краснознаменская СШ
Дата: 21.06.16г. ФИО учителя: Мукушева Д.С.
КЛАСС: 1 Количество присутствующих:
Количество присутствующих:
Цели обучения, которые необходимо достичь на данном уроке 1.1.2.5 ** выполнять устно сложение и вычитание без перехода через десяток однозначных и двузначных чисел
Цели обучения Все учащиеся смогут:
выполнять устно сложение и вычитание без перехода через десяток однозначных чисел
Большинство учащихся будут уметь:
понимать взаимосвязи между компонентами действий сложения и вычитания
Некоторые учащиеся смогут:
Применять переместительное свойство сложения
Языковая цель Учащиеся могут:
объяснять понятия взаимообратные действия
Ключевые слова и фразы:
Қосу – сложение – addition,
азайту – вычитание – subtraction
Стиль языка, подходящий для диалога/ письма в классе:
Вопросы для обсуждения:
По вашему мнению, какие действия называются взаимообратными?
Можете ли вы сказать, зачем?
необходимо переместительное свойство сложения?
Подсказки: Плюс, минус
Предыдущее обучение Порядок действий в выражениях со скобками
Цель: определить порядок действия в выражениях со скобками.
План
Планируемые сроки Планируемые действия (замените записи ниже запланированными действиями) Ресурсы
Действия учителя
Начало урока Создание коллаборативной среды:
Релаксационное упражнение: «Плюс-минус»
Учащиеся становятся в круг. Им раздаются карточки «+», «-». Учащиеся повторяют за учителем
Я – ПЛЮС,
И этим я горжусь!
Я для сложения гожусь.
Я добрый знак соединенья,
И в том мое предназначенье.
Чтобы правильно сложить,
Надо правильно дружить.
Если ссора иль сраженье –
Не получится сложенья.
Я — МИНУС,
Тоже добрый знак.
Ведь не со зла я отнимаю,
А роль свою лишь выполняю.
Проходила наша Таня
С малышами вычитанье.
Вычитанье как понять?
Надо что-нибудь отнять.
— Плюсы и минусы притягиваются друг к другу, обнимитесь. Карточки «+», «-»
Середина урока Задание на повторение:
Индивидуальная работа учащихся: «Карточка — решалочка»
учащимся раздаются индивидуальные карточки с выражениями со скобками, которые необходимо решить.
Взаимопроверка: (обмен индивид. карточками)
— Сегодня мы поговорим о взаимообратных действиях.
— Напомните мне, пожалуйста, какие математические действия вам известны? (Сложение и вычитание)
Работа с ключевыми понятиями:
Қосу – сложение – addition ,
азайту – вычитание – subtraction
Взаимообучение: (деление на 2 группы «+» и «-»)
Составление постеров по предложенному материалу
1 группа – взаимообратные действия
2 группа – переместительное свойство сложения
Защита постеров
Вывод: Сложение и вычитание – взаимообратные действия. Сложение проверяется вычитанием и наоборот.
Переместительное свойство сложения – от перестановки мест слагаемых значение суммы не изменяется
Самостоятельная индивидуальная работа:
«Спортивный инвентарь»
1. Проанализируйте иллюстрацию
2. Составьте примеры про спортивные предметы
3. Попробуйте составить примеры обратные данным
Проверка
Музыкальная физминутка: «Спортивная гимнастика»
Индивидуальная работа:
Реши
Какие числа спрятаны под спортивными предметами?
Уровни мышления Критерии Дескрипторы
Знание, понимание Знает и
понимает как находить неизвестное число с помощью проверки -понимает содержание обратных действий
— представляет ход решения задания
— вычисляет выражения
Работа в парах моделированием: игра «Кубики»
Правила игры:
1. Смоделируйте по развертке 2 кубика
2. Напишите на сторонах кубиков любые однозначные или двузначные числа
3. Первый игрок бросает 2 кубика и из выпавших чисел составляет выражения на сложение или вычитание
4. Второй игрок проверяет первого и составляет обратное действие
Затем учащиеся меняются ролями.
Индивидуальные карточки
ФО — звездочки
Аудирование и говорение
Информационные листы,
Листы А3,
Магнитная доска
с.12
ФО – флажки
ИКТ-видеоролик
с.13
КО
с. 13
2 развертки кубиков, ножницы,
клей,
маркеры, чистый листок
Конец урока — Вспомните, пожалуйста, ключевые слова нашего урока. (Сложение, вычитание)
Рефлексия: «Ромашка»
На лепестках ромашки записаны вопросы по теме урока. Учащиеся выбирают по одному лепестку с вопросом и отвечают на него:
— Что ты узнал на уроке?
— Понравился ли тебе урок? Что больше всего понравилось?
— В чем ты испытывал неуверенность?
— Что тебе было непонятно?
— Как ты можешь оценить свое настроение в данный момент? Трехъязычие -говорение
Разноцветная «Ромашка»
Дополнительные сведения
Дифференциация. Как вы планируете поддерживать учащихся? Как вы планируете стимулировать способных учащихся? Оценивание.
Как вы планируете увидеть приобретенные знания учащихся Межпредметные связи
Помогать, направлять словесно. ФО -Звездочки, флажки Технический труд (моделирование кубиков), музыка(физминутка)
Использование ИКТ
Моральные ценности:
Взаимопомощь и взаимоподдержка
Итоговая оценка
Какие два аспекта в обучении прошли очень хорошо (с учетом преподавания в учении)?
1.
2.
Какие два обстоятельства могли бы улучшить урок (с учетом преподавания и учения)?
1.
2.
Что узнал об ученике в целом или отдельных лиц?
Полный текст материала смотрите в скачиваемом файле.
На странице приведен только фрагмент материала.
Решение уравнений (2 класс) — online presentation
1. 23 марта
Математика2. Устный счёт
Мартышка висит на хвосте и жуёт бананы. В каждойпередней лапе у неё по 5 бананов, а в каждой задней лапе –
на 1 банан больше, чем в передней. Сколько бананов у
мартышки?
22 банана
+
+
Открой учебник на с. 32.
Рассмотри задание 1.
Какие правила нужно помнить, чтобы решить данные
уравнения?
Чтобы найти целое, нужно сложить части.
Чтобы найти часть, нужно из целого вычесть другую часть.
Обведи на схемах целое и подчеркни части.
Запиши, как найти Х.
4. В задании 2 по данным уравнениям составь схемы. Определи части и целое. Куда запишем целое? Наверх. Куда запишем части? Вниз.
Проверь себяВыполни решение
уравнений с фигурами
самостоятельно. № 3.
5. Прочитай задание 4.
Что нового появилось в решении уравнения?Нужно сделать проверку.
Рассмотри уравнение под «а».
Что записано под чертой?
Сравни этот пример и уравнение.
Почему получился именно такой пример в проверке?
Х=1. На место неизвестного число в уравнении записали
его значение 1. Второе слагаемое 7. Значение суммы 8.
Сравни ответ в уравнении и в примере.
Запиши это сравнение 8=8 под вторым слагаемым.
6. Реши уравнения под буквой «б» и «в», выполни проверку.
Алгоритм1. ЧТО? (Найди части и целое)
2. КАК? (Вспомни правило нахождения части или целого)
3. КОРЕНЬ (Подчеркни)
4. ПРОВЕРКА (Впиши значение Х в уравнение и получи пример)
5. Сравни результаты.
Проверь себя
5–Х=1
Х=5–1
Х=4
5–4=1
1=1
Х–4=5
Х=4+5
Х=9
9–4=5
5=5
7. Прочитай задание 5. Исправь ошибки зелёной ручкой.
Проверь себя>
=
7
Прочитай задание 6.
Помоги зайчику найти самый короткий пусть.
Воспользуйся линейкой. Результаты измерений
запиши.
8. Прочитай задание 7. Выполни его УСТНО!
Рассмотри схемы номер 1 и 2.Что ты заметил?
Задача 2 очень похожа на задачу 1, только в ней появился
второй вопрос. Вторая задача будет решаться в 2 действия.
Придумай и реши задачи 1 и 2 устно.
Рассмотри схемы 3 и 4.
Что ты заметил?
Это задачи обратные данным.
Составь и реши задачи 1 и 2 устно.
Спасибо, за работу на уроке!
Практическое введение в Jetpack Compose Android Apps
За последние несколько лет разработка Android внесла значительные изменения в структуру приложений, язык, используемый для разработки, инструменты и библиотеки, ускоряющие разработку, и улучшения в тестировании приложений. . Что не изменилось за все эти годы, так это инструментарий Android UI.
Это меняется с Jetpack Compose, современным инструментарием Android для создания собственного пользовательского интерфейса. Он упрощает и ускоряет разработку пользовательского интерфейса на Android и представляет собой смену парадигмы в разработке Android, как мы ее знаем.Переход к декларативному программированию для описания пользовательского интерфейса является долгожданным изменением, которое превалирует на всех платформах с появлением таких фреймворков, как React для Интернета, SwiftUI для iOS и Flutter для кроссплатформенной разработки.
Мотивы создания Jetpack Compose
Jetpack Compose — это полностью переписанный инструментарий Android UI с нуля. Это огромная задача даже для компании масштаба Google, поэтому важно понимать, зачем вообще нужен такой фреймворк, как Jetpack Compose.
- Существующий инструментарий Android UI привязан к операционной системе. Это означает, что если бы команда Android внесла некоторые новые улучшения в систему View, нам пришлось бы дождаться выпуска Android API, чтобы получить эти улучшения. Обычно это происходит только раз в год. Отделение системы просмотра от ОС упрощает быстрое исправление ошибок и обеспечивает обратную совместимость с улучшениями.
- Некоторые важные API-интерфейсы Android были созданы более десяти лет назад. Опыт разработки и ожидания в 2021 году значительно отличаются от того, что было при первом запуске Android в 2008 году. Большой прогресс был достигнут с внедрением Jetpack, который начал разбивать основные компоненты на более обслуживаемые библиотеки. Однако система просмотра в Android во многом осталась неизменной. Печально известный файл View.java, который является одной из наиболее важных частей системы просмотра Android, теперь состоит из 30 тысяч строк. Это также усложнило введение новых шаблонов и изменений.
- Обычный рабочий процесс разработчика Android включает в себя множество переключений контекста. Текущий рабочий процесс включает определение представлений в файлах XML. Вы добавляете бизнес-логику на свои экраны с помощью Kotlin / Java, а затем ссылаетесь на представления XML с помощью идентификаторов / тегов. Когда вам нужно сослаться на стили и размеры, вы сохраняете их в XML. Это постоянное переключение контекста определенно оказывает определенное влияние на продуктивность, с чем мы согласны. Некоторые могут возразить, что это фактически развязка — разве развязка не должна быть хорошей вещью? Что ж, это, безусловно, правда, что развязка — это хорошая инженерная практика.Однако вы по-прежнему ссылаетесь на эти XML-файлы в своем коде Kotlin и вносите в него изменения. На самом деле это просто иллюзия развязки.
- Управлять состоянием на Android сложно. Способ управления состоянием пользовательского интерфейса всегда был сложной задачей, поскольку представления хранят свое собственное состояние. Это заставляет вас гарантировать, что состояние, которое вы храните в своих моделях представлений и презентаторах, синхронизируется с состоянием внутри представлений. Это действительно подвержено ошибкам и является источником большинства ошибок в приложениях Android.
Обучение на примерах
В этом контексте давайте посмотрим, как вы можете использовать Jetpack Compose для создания приложений Android. Эта статья нацелена на практическое обучение, так что не стесняйтесь следовать ей. Прежде чем вы сможете начать, вам нужно будет выполнить базовую настройку, чтобы ваши компьютеры были готовы к созданию приложений Jetpack Compose. Следуйте инструкциям в этом руководстве по настройке и установите соответствующие инструменты, необходимые для работы с Compose: http://bit.ly/SetupCompose.
Все примеры, которые вы увидите в этой статье, можно найти в этом репозитории GitHub, который я поддерживаю: Learn Jetpack Compose by Example (http: // bit.ly / LearnComposeByExample). Он также содержит другие примеры и значительный объем документации, так что вы можете просто читать примеры и учиться в процессе.
Давайте нырнем!
Привет, мир
Было бы шокирующим, если бы руководство началось без классического примера «Hello World». Итак, давайте посмотрим, что нужно для отображения текста на экране.
class SimpleTextActivity: AppCompatActivity () {
переопределить удовольствие onCreate (savedInstanceState: Bundle?)
{
супер.onCreate (сохраненныйInstanceState)
setContent
{
SimpleText («Привет, мир»)
}
}
}
@Composablefun SimpleText (текст: строка) {BasicText (текст)}
Попробуем разобраться во всем, что здесь происходит. Сначала вы создаете простое действие Android и переопределяете метод onCreate
. Это довольно стандартно, и вы делаете это даже со старым набором инструментов пользовательского интерфейса. Что интересно, так это метод setContent
, который принимает замыкающую лямбду.Этот метод — переход к Jetpack Compose-land, где все — радуга и солнце. Метод setContent
позволяет передать ему функцию @Composable . Здесь вы передаете функцию SimpleText и передаете текст «Hello World» этому методу.
Этот метод — переход к стране Jetpack Compose, где все — радуга и солнце.
Вот где действительно начинается интересное. Функции @Composable являются наиболее фундаментальными строительными блоками для определения пользовательского интерфейса в Jetpack Compose.Эти функции похожи на блоки и состоят из других функций @Composable . В этом примере вы определяете функцию с именем SimpleText
, которая принимает строковый параметр. Внутри функции вы используете составную функцию BasicText
, которая является одной из предопределенных составных частей, предоставляемых Jetpack Compose. Давайте проверим ваше приложение и посмотрим, что отображается на экране, как показано на рис. 1 , рис. 1 .
Рисунок 1: Отобразите «Hello World» с помощью Jetpack Compose.
Вы заметите, что «Hello World» отображается на экране в верхнем левом углу. Поскольку вы не определили, как должен отображаться текст, он отображается в местоположении по умолчанию, то есть в верхнем левом углу.
Вы сразу заметите, что для визуализации того, что вы только что создали, вам нужно было запустить приложение. Должен быть способ получше, правда? Вы делаете ставку! Compose поставляется с очень удобным способом визуализации составных элементов прямо в Android Studio.Он поставляется с аннотацией под названием @Preview , которая позволяет вам создавать «превью» для только что созданных вами компонентов. Вот как вы это настроили —
@Preview @Composable fun SimpleTextPreview () {SimpleText ("Hello World!")}
После того, как вы создали превью для своих компонентов, вы можете просматривать их прямо из Android Studio, как показано на рис. 2 . Compose делает еще один шаг вперед и позволяет вам также взаимодействовать с компонентами и видеть их в действии без необходимости использовать их в своем приложении.Наконец, если вы хотите увидеть их в действии на устройстве, вы можете развернуть составную функцию
для запуска на эмуляторе / устройстве, фактически не используя ее где-либо в приложении. Подобные функции действительно ускоряют разработку пользовательского интерфейса и делают вашу работу более продуктивной.
Рисунок 2: Вы можете предварительно просмотреть свои составляемые прямо из Android Studio.
Модификаторы
Теперь вы знаете, как вывести текст на экран. Давайте попробуем украсить текст, добавив цвет фона и отступы вокруг него.
@Composable fun SimpleText (text: String) {
BasicText (
текст = текст,
modifier = Modifier.background (Color.LightGray) .padding (16.dp)
)
}
Вы все еще используете тот же пример, с которого начали, но вы внесли несколько небольших улучшений. Вы заметите, что вы передаете новый параметр под названием модификатор
в составной объект BasicText
. Модификаторы — ваш лучший друг в Jetpack Compose, а также моя любимая функция.Вы можете думать о модификаторах как о реализациях шаблона декоратора, которые используются для изменения составного объекта, к которому он применяется. Он добавляет функциональность к Composable, к которому он применяется, и большинство составных функций по умолчанию принимают параметр Modifier
.
В этом примере вы используете модификаторы background и padding с соответствующими значениями, чтобы получить желаемый эффект для вашего текста. Еще одна интересная вещь, на которую следует обратить внимание, — это то, как вы можете назначать размеры dp
без использования ресурсов XML или каких-либо сложных преобразований.Это функция расширения
для типа Int
. Он возвращает класс Dp
, который является первоклассным гражданином в Compose. Это упрощает создание констант для этих значений в чистом Kotlin и их преобразование во время выполнения по мере необходимости. Вы можете увидеть это в действии на Рисунок 3 .
Рисунок 3: Использование модификаторов для добавления функциональности в составную функцию.
Еще одна интересная особенность модификаторов заключается в том, что их порядок влияет на поведение.В приведенном выше примере вы сначала указали цвет фона, а затем отступ. Это гарантирует, что цвет также будет применен к области с отступом. Но что, если вы хотите, чтобы цвет был только в области, охватываемой отступом? Для этого просто переверните два утверждения и получите желаемое поведение.
@Composable fun SimpleText (text: String) {
BasicText (
текст = текст,
modifier = Модификатор
.обивка (16.dp)
.background (Color.LightGray).
)
}
Вы можете увидеть изменение в Рисунок 4 .
Рисунок 4: Порядок модификатора влияет на поведение.
Что значит быть «декларативным»?
Вы начинаете просто погружаться в Compose и постепенно начинаете обдумывать некоторые базовые концепции. Давайте посмотрим на другой пример — на этот раз вы попытаетесь отобразить диалоговое окно с предупреждением. Это интересный пример, потому что если вы не понимаете, что означает «декларативность», это должно прояснить ситуацию и, надеюсь, дать вам тот момент «ага», когда многие вещи начнут обретать смысл.
Говоря о декларативном программировании, важно также говорить об императивном программировании, чтобы обеспечить контраст. Один из распространенных способов сравнения этих подходов — использование аналогии «Что и как».
Императивное программирование — это определение «Как» при создании пользовательского интерфейса. «Как мне отрендерить определенный пользовательский интерфейс и какие точные шаги необходимы для его визуализации?»
Давайте рассмотрим пример отображения диалогового окна с предупреждением в вашем приложении. Это то, что вы обычно делаете в классическом Android.
val alertDialog = AlertDialog.Builder (context) .setTitle («Журнал CODE!»). SetMessage («Разве это не потрясающе?»)
// Где-то еще в коде if (some_condition_is_met ()) {alertDialog.show ()}
// Где-то еще в коде if (some_other_condition_is_met ()) {alertDialog.dismiss ()}
С другой стороны, декларативное программирование заключается в указании «Что» при создании пользовательского интерфейса. «Что я должен сделать?»
Попробуем реализовать ту же функциональность с помощью Compose.
@Composablefun AlertDialogComponent () {
if (some_condition_is_met ()) {
AlertDialog (title = {Text ("CODE Mag!")}, Text = {Text (text = "Привет!")})
}
}
Сначала вы проверяете, выполняется ли условие для отображения диалогового окна с предупреждением. Если он выполняется, вы используете предварительно определенный AlertDialog
, который можно комбинировать с соответствующими метаданными. Обратите внимание, что вы не выполняете никаких изменений и не вызываете методы show / dismiss для обновления внутреннего состояния пользовательского интерфейса.Вы просто указываете, как ваш пользовательский интерфейс выглядит «прямо сейчас» с учетом всех условий, о которых должен заботиться этот компонент пользовательского интерфейса. Тот факт, что этот путь кода выполняется, приводит к обновлению содержимого экрана. В этом случае отображается диалоговое окно с предупреждением. Если условие не выполняется, диалоговое окно предупреждения не отображается. Еще одно преимущество, о котором меньше говорят, заключается в том, что ваша программа может быть независимой от контекста. Это означает, что, поскольку ваш код связан с конечной целью, один и тот же код можно повторно использовать в разных сценариях.
Государство
Реагирование на состояние — это основа работы Jetpack Compose. Compose предоставляет примитивы для управления состоянием внутри Composable функции. Давайте посмотрим на пример, в котором используются некоторые из этих примитивов. Вы собираетесь создать составной объект с кнопкой, которая меняет свой цвет в зависимости от того, была ли она нажата. Вы можете увидеть конечный результат, которого надеетесь достичь, в Рис. 5 .
Рисунок 5: Пример использования API примитивного состояния в Jetpack Compose
@Composable
fun ButtonClickComponent () {
var showPopup by Remember {
mutableStateOf (ложь)
}
val color = if (showPopup) {
Цвет.Зеленый
} еще {
Красный цвет
}
val colors = ButtonDefaults.buttonColors (backgroundColor = цвет)
Кнопка(
onClick = {showPopup = true},
colors = btnColors
) {
Текст (текст = "Нажми меня")
}
}
Начните с создания изменяемой переменной с именем showPopup
, которая инициализируется с использованием пары интересных ключевых слов, с которыми вы, вероятно, никогда раньше не сталкивались при разработке Android: помните
и mutableStateOf
.Реагирование на изменения состояния — это основное поведение Compose. Каждый раз, когда значение этой переменной изменяется, все компоненты, которые используют это значение, интеллектуально перерисовываются и обновляются. Как будто этот составной объект «подписан» на это значение. Другой, Remember {}
, является вспомогательным компонуемым компонентом, который вычисляет значение, переданное ему только в первый раз, когда составной компонент составляется. Затем он возвращает одно и то же значение для каждой последующей композиции. Эта перерисовка составного объекта называется Перекомпозиция
.Это происходит очень эффективно, и перекомпоновываются только те компоненты, которые используют это значение; остальное остается как есть. Подобные концепции существуют и в других декларативных фреймворках пользовательского интерфейса, таких как React и Compose, вдохновленные этими реактивными фреймворками.
Макеты
Давайте посмотрим на что-нибудь более реалистичное. На этот раз вы собираетесь реализовать компонент, который выглядит как , рис. 6, .
Рисунок 6: Простой компонент с заголовком, подзаголовком и изображением
Вы часто видите компоненты, которые выглядят так во многих приложениях, и используете их ежедневно.Прежде чем вы начнете создавать этот компонент в Compose, давайте разберем этот компонент на несколько основных частей, как вы можете видеть на рис. 7 , . Компонент представляет собой строку с двумя элементами. Первый элемент — это представление изображения, а второй элемент — столбец, содержащий два элемента.
Рисунок 7: Компонент, разбитый на основные части
Если бы вы создавали такой компонент с использованием классического Android, вы, вероятно, использовали бы что-то вроде LinearLayout
или RelativeLayout
.Это может заставить вас задуматься: «Что эквивалентно LinearLayout
в Jetpack Compose?» Более того, было бы неплохо, если бы существовал способ узнать соответствующие API-интерфейсы Compose для существующей классической функциональности Android? Чтобы решить эту проблему, я создал инструмент, который делает именно это. Вы можете найти его здесь: http://bit.ly/WhichComposeApiToUse. Как вы видите на рис. 8 , Jetpack Compose предоставляет примитивы макета, такие как Row и Column, для упорядочивания ваших компонентов. И это именно то, что вы будете использовать для компонента, который вы пытаетесь создать.
Рисунок 8: JetpackCompose.app — это инструмент, который поможет вам ответить на вопрос «Какой Compose API использовать?»
@ Составной
fun ImageWithTitleSubtitleComponent (
название: Строка,
подзаголовок: Строка,
imageUrl: String
) {
Открытка(
shape = RoundedCornerShape (4.dp),
modifier = Modifier.fillParentMaxWidth (). padding (16.dp)
) {
Строка(
modifier = Modifier.fillMaxWidth ()
.обивка (16.dp)
) {
// Предположим, мы создали компонент для рендеринга изображения. NetworkImage (imageUrl)
Столбец(
modifier = Modifier.padding (start = 16.dp)
) {
BasicText (заголовок) BasicText (подзаголовок)
}
}
}
}
Приведенный выше пример кода довольно прост.Вы используете компоненты компоновки так же, как вы описали, что хотите построить. Именно так и должна выглядеть разработка программного обеспечения — достаточно просто описать то, что вы пытаетесь создать. Вы также можете использовать составную карту Card
, которая соответствует спецификациям Material Design. Как и Card
, есть десятки других предопределенных компонентов из спецификации Material Design, которые уже доступны для использования!
Список
Другая распространенная функция, которую вы, вероятно, видите в каждом приложении, — это какой-то список.Напоминаем, что достаточно взглянуть на , рис. 9, , чтобы увидеть объем кода, необходимый для создания списка производительности в классическом Android.
Рисунок 9: Код, необходимый для создания списка производительности в классической версии Android.
Теперь давайте сравним это с тем, что нужно для создания списка производительности в Jetpack Compose. Вы собираетесь использовать тот же инструмент, который вы видели в предыдущем примере, чтобы найти подходящий API для достижения этой цели. Инструмент (http://bit.ly/WhichComposeApiForRecyclerView) сообщает вам, что LazyColumn
является эквивалентом RecyclerView
в Jetpack Compose, поэтому давайте воспользуемся этим.Кроме того, вы также собираетесь использовать составной компонент ImageWithTitleSubtitleComponent
, который вы создали в одном из предыдущих примеров. Листинг 1 демонстрирует весь код, необходимый для создания высокопроизводительного списка, способного содержать элементы динамического списка.
Листинг 1: Пример, демонстрирующий создание списка исполнителей в Compose
@ Составной
весело ListComponent (список: Список ) {
LazyColumn (modifier = Modifier.fillMaxHeight ()) {
Предметы(
items = список,
itemContent = {listItem -> ImageWithTitleSubtitleComponent (
title = listItem.заглавие,
subtitle = listItem.subtitle,
imageUrl = listItem.imageUrl
)}
)
}
}
Для воссоздания аналогичной функциональности в классическом Android требуются десятки строк кода. Когда я смотрю на Листинг 1 , я вынужден задуматься о том, почему создание списка на Android не всегда было таким простым. Чтобы добраться сюда, потребовалось несколько лет, но я рад, что именно так выглядит будущее Android.
Создание вашего первого полного экрана
Теперь, когда у вас есть хорошее представление об основных концепциях Jetpack Compose, давайте попробуем создать экран с реальным вариантом использования. Допустим, вы хотите создать экран для приложения, отображающего список ваших любимых комических супергероев.
Листинг 2 начинается с создания нового Activity с именем SuperheroListActivity
. Кроме того, вы также инициализируете реализацию ViewModel
под названием SuperheroesViewModel
, которая будет отвечать за управление бизнес-логикой в вашем приложении.Наконец, вы создаете настраиваемый составной объект под названием SuperheroListScreen
, который будет отвечать за представление логики пользовательского интерфейса для вашего экрана. Он принимает объект живых данных, содержащий список супергероев, которые будут отображаться на этом экране.
Листинг 2: Действие, на котором будет отображаться экран списка супергероев
class SuperheroListActivity: AppCompatActivity () {
переопределить веселье onCreate (savedInstanceState: Bundle?) {
super.onCreate (savedInstanceState)
val viewModel = ViewModelProvider (это).получить (SuperheroesViewModel :: class.java)
setContent {SuperheroListScreen (viewModel.superheroes)}
}
}
В листинге 3 представлена реализация модели ViewModel
, которая содержит бизнес-логику для вашего экрана. Он отвечает за загрузку списка супергероев из сети. В этом примере просто имитируйте сетевой запрос, добавив задержку в две секунды, и установите объект LiveData
с соответствующим значением. SuperheroesViewModel
также предоставляет объект LiveData
, который будет использоваться вашим пользовательским интерфейсом.Далее давайте посмотрим, как реализован SuperheroListScreen
.
Листинг 3: Реализация ViewModel, которая содержит бизнес-логику для вашего экрана
class SuperheroesViewModel: ViewModel () {
val superheroes = liveData {
val superheroList = loadSuperheroes ()
испускать (список супергероев)
}
// Добавлена задержка в 2 секунды для эмуляции сетевого запроса. Этот способ
// просто устанавливает список супергероев в живые данные через 2 секунды.приостановить веселье loadSuperheroes (): List {
задержка (2000)
вернуть listOf (
Супергерой («Железный человек», 43, «https ...»),
Супергерой («Халк», 38, «https ...»),
...
)
}
}
// Класс модели для метаданных супергероя
класс данных Superhero (
имя val: Строка,
val age: Int,
val profileImageUrl: строка
)
Каждый раз, когда вы представляете новую структуру, один из наиболее важных вопросов, который необходимо решить, — это совместимость с существующей системой.Функциональная совместимость может быть одним из самых больших препятствий для принятия, и Compose отлично справляется с этой задачей, создавая убедительный рассказ об этом. Вы можете легко использовать Compose и классический Android как взаимозаменяемые. Кроме того, он также позволяет преобразовать некоторые существующие концепции в те, которые понятны Compose.
Например, приведенный ниже фрагмент кода иллюстрирует преобразование объекта LiveData
в «состояние» Jetpack Compose с использованием функции расширения exploreAsState
для объекта данных в реальном времени.Напоминаем, что вы видели пример использования состояния Jetpack Compose в разделе «Состояние». Затем просто проверьте, является ли объект
state
(который является списком) пустым или нет. Когда он пуст, вы хотите показать экран загрузки; в противном случае вы захотите показать список супергероев.
@ Составной
весело SuperheroListScreen (
list: LiveData <Список <Супергерой>>) {
val superheroes по list.observeAsState (
начальный = emptyList ()
)
если (супергерои.пусто())
{LoadingComponent ()}
else {SuperheroListComponent (супергерои)}
}
Экран загрузки отображается на экране, когда выполняется запрос на загрузку списка супергероев. Логика реализации экрана загрузки довольно проста.
@ Составной
fun LoadingComponent () {
val alignment = CenterHorizontally
Столбец(
modifier = Modifier.fillMaxSize (),
verticalArrangement = Центр,
horizontalAlignment = выравнивание
) {
CircularProgressIndicator (Модификатор.wrapContentWidth (по центру по горизонтали)
)
}
}
Вы начинаете с создания нового компонента, так как этот вариант использования довольно распространен, и создание отдельного компонента упрощает его повторное использование в других местах. Вы используете макет Column
и настраиваете его так, чтобы он занимал весь экран, с помощью модификатора fillMaxSize
. Кроме того, вы также настраиваете дочерние элементы этого столбца для вертикального и горизонтального центрирования. Наконец, вы используете предварительно определенный CircularProgressIndicator
, который является частью спецификации Material Design для отображения индикатора загрузки.
Последнее, что нужно вашему экрану, - это способ отображения списка супергероев. Вы в значительной степени будете использовать комбинацию нескольких примеров, которые вы видели ранее, особенно в разделах «Макет» и «Список». Листинг 4 объединяет все вместе, и это все, что вам нужно для воспроизведения экрана, который вы видите на , рис. 10, .
Листинг 4: Составная функция, отвечающая за отображение списка супергероев
@ Составной
fun SuperheroListComponent (
superheroList: Список <Супергерой>
) {
LazyColumn {
Предметы(
items = superheroList,
itemContent = {супергерой ->
Открытка(
shape = RoundedCornerShape (4.дп),
backgroundColor = Color.White,
modifier = Модификатор
.fillParentMaxWidth ()
.padding (8.dp)
) {
ImageWithTitleSubtitleComponent (
superhero.name,
"Возраст: $ {superhero.age}",
супергерой.profilePictureUrl !!
)
}
}
)
}
}
Рисунок 10: Экран со списком супергероев в действии
Сводка
Благодаря новому набору декларативных пользовательских интерфейсов разработка под Android может стать еще интереснее. Хотя Compose все еще находится в зачаточном состоянии, он уже дает многообещающие результаты, и сообщество очень воодушевлено этим. Есть достаточно сигналов, указывающих на то, что Compose де-факто станет способом создания приложений для Android.Он также снижает барьер для входа для многих не инженеров благодаря интуитивно понятным API-интерфейсам, которые легко понять.
Я надеюсь, что эта статья дала вам представление о том, что можно делать с помощью Jetpack Compose. Мне не терпится увидеть, как вы используете его для создания потрясающих мобильных приложений. Удачного сочинения!
Google: Jetpack Compose позволяет разработчикам Android писать приложения с «значительно меньшим объемом кода»
Все сеансы Transform 2021 теперь доступны по запросу.Смотри.
Сегодня Google выпустила альфа-версию Jetpack Compose, своего набора инструментов пользовательского интерфейса, чтобы помочь разработчикам «создавать красивый пользовательский интерфейс для всех платформ Android с собственным доступом к API платформы». Хотя альфа-версия означает, что она определенно не готова к производству, Jetpack Compose обещает позволить разработчикам Android создавать приложения с использованием «значительно меньшего количества кода, интерактивных инструментов и интуитивно понятных API-интерфейсов Kotlin». Альфа-версия также включает новые инструменты, включая анимацию, макеты ограничений и оптимизацию производительности.
Android Jetpack, который Google представил на конференции разработчиков I / O 2018, представляет собой набор компонентов для ускорения разработки приложений. Думайте об этом как о преемнике Support Library, набора компонентов, которые упрощают использование новых функций Android при сохранении обратной совместимости. Jetpack Compose, который Google впервые продемонстрировал на конференции разработчиков I / O 2019, представляет собой разукрупненный инструментарий, предназначенный для упрощения разработки пользовательского интерфейса путем объединения модели реактивного программирования с Kotlin.В июне Google пообещал, что Jetpack Compose выйдет в альфа-версии этим летом и выпустит версию 1.0 в следующем году. Первый шаг выполнен.
Низкий код и подходы без кода к разработке программного обеспечения в моде. Все, от стартапов до технологических гигантов, пытаются упростить работу разработчика. Поэтому неудивительно, что Google стремится упростить разработку своей крупнейшей платформы - по состоянию на май 2019 года у Android было более 2,5 миллиардов активных устройств в месяц.
Реактивный ранец Compose Alpha
Google утверждает, что разработчики предпочитают декларативные API для создания пользовательского интерфейса.Таким образом, Jetpack Compose сочетает в себе «API-интерфейсы для высококачественных масштабируемых приложений, интуитивно понятный язык и модель реактивного программирования». Команда создала набор инструментов с учетом возможности взаимодействия - он совместим с представлениями Android и кодом Android, поэтому разработчики могут использовать его без необходимости переписывать свои приложения.
Кроме того, Google написал API Compose вместе с набором канонических примеров приложений, использующих его Material Design. Примеры приложений Compose доступны на GitHub и непосредственно в Android Studio:
- Взаимодействие с представлениями (начните смешивать составные функции в существующем приложении)
- Анимации
- Ленивые списки
- Макет ограничения
- Материальные компоненты пользовательского интерфейса
- Тестирование
- Текст и редактируемый текст
- Тематика и графика
- Управление окнами
- Ввод и жесты
- Начальная поддержка A11Y
- Оптимизация производительности
Говоря об Android Studio, Google обновил версию 4.2 Canary с командой Jetbrains Kotlin, чтобы помочь создавать приложения с помощью Compose. Усовершенствования включают плагин компилятора Kotlin для генерации кода, аннотации Compose Preview, интерактивные предварительные просмотры Compose в реальном времени, развертывание отдельных компонентов Compose на любом устройстве, завершение Compose Code и API Sample Data для Compose.
Jetpack Compose в Android Studio разработан, чтобы помочь вам быстро итерировать пользовательский интерфейс вашего приложения. Вы можете предварительно просмотреть свои компоненты Compose в процессе сборки, не развертывая приложение на устройстве или эмуляторе.Чтобы создать предварительный просмотр макета, напишите компонуемую функцию, которая не принимает никаких параметров, и добавьте аннотацию @Preview.
Android Studio предоставляет интерактивный режим предварительного просмотра, который позволяет вам нажимать или вводить элементы пользовательского интерфейса, в то время как пользовательский интерфейс реагирует так, как если бы он был в установленном приложении. Вы также можете развернуть один составной компонент на устройстве или эмуляторе по умолчанию, чтобы опробовать свой пользовательский интерфейс без переустановки всего приложения или перехода к его местоположению. Android Studio создает новое действие, содержащее пользовательский интерфейс, созданный этой функцией, и развертывает его в вашем приложении на устройстве.
Совместимость с существующим кодом Android
Иерархия представлений Android обычно представлена как дерево виджетов пользовательского интерфейса. Обновление пользовательского интерфейса обычно заключается в обходе дерева с использованием функций, которые изменяют внутреннее состояние виджета. Команда Android Jetpack не только считает это утомительным, но и отмечает, что обновление представлений вручную увеличивает вероятность ошибок.
Вот почему Jetpack Compose использует полностью декларативный компонентный подход. Вы описываете свой пользовательский интерфейс как функции, преобразующие данные в иерархию пользовательского интерфейса; при изменении базовых данных платформа Compose автоматически обновляет иерархию пользовательского интерфейса, ускоряя разработку и сокращая количество ошибок.
Но переход на новую структуру - это большое изменение для существующих проектов и кодовых баз. Таким образом, Google разработал Compose так же легко, как и Kotlin, - он полностью совместим с существующим кодом Android.
Если вы создаете новое приложение, Google надеется, что вы полностью реализуете свой пользовательский интерфейс с помощью Compose. Но, учитывая, что он все еще находится в стадии альфа, вам, вероятно, пока не стоит этого делать. Для существующих кодовых баз Google рекомендует один из двух способов объединения Compose с существующим дизайном пользовательского интерфейса:
- Добавьте элементы Compose в существующий пользовательский интерфейс, либо создав полностью новый экран на основе Compose, либо добавив элементы Compose в существующий фрагмент или макет представления.
- Добавьте элемент пользовательского интерфейса на основе представления в составные функции. Это позволяет вам добавлять виджеты, не являющиеся компонентами Compose, например MapView или WebView, в дизайн на основе Compose.
Чтобы начать работу с Jetpack Compose, ознакомьтесь с Учебным пособием по составлению, настройкой и путём создания. Вы также можете попробовать MDC Compose Theme Adapter, который позволяет повторно использовать темы компонентов материала в пользовательском интерфейсе Compose.
VentureBeat
Миссия VentureBeat - стать цифровой городской площадью, где лица, принимающие технические решения, могут получить знания о преобразующих технологиях и транзакциях.На нашем сайте представлена важная информация о технологиях и стратегиях обработки данных, которая поможет вам руководить своей организацией. Мы приглашаем вас стать участником нашего сообщества, чтобы получить доступ:- актуальная информация по интересующим вас вопросам
- наши информационные бюллетени
- закрытый контент для лидеров мысли и доступ со скидкой к нашим призовым мероприятиям, таким как Transform 2021 : Узнать больше
- сетевые функции и многое другое
State and Jetpack Compose | Разработчики Android
Состояние в приложении - это любое значение, которое может меняться со временем.Это очень широкий определение и охватывает все, от базы данных комнаты до переменной в учебный класс.
Все приложения Android отображают состояние для пользователя. Несколько примеров состояния в Android приложений:
- Закусочная, которая показывает, когда сетевое соединение не может быть установлено.
- Сообщение в блоге и связанные с ним комментарии.
- Анимация пульсации на кнопках, которая воспроизводится, когда пользователь нажимает на них.
- Наклейки, которые пользователь может нарисовать поверх изображения.
Jetpack Compose поможет вам четко указать, где и как вы храните и используете состояние в приложении для Android.В этом руководстве основное внимание уделяется связи между состоянием и composables и API, которые Jetpack Compose предлагает для работы с состоянием. с легкостью.
Состояние и состав
Compose является декларативным, и поэтому единственный способ обновить его - вызвать
тот же составной с новыми аргументами. Эти аргументы представляют
Состояние пользовательского интерфейса. Каждый раз, когда состояние обновляется, происходит перекомпозиция . Как
в результате такие элементы, как TextField
, не обновляются автоматически, как в
императивные представления на основе XML.Композиционному объекту должно быть явно указано новое состояние.
для соответствующего обновления.
@Composable
fun HelloContent () {
Столбец (модификатор = Modifier.padding (16.dp)) {
Текст(
text = "Привет!",
modifier = Modifier.padding (bottom = 8.dp),
style = MaterialTheme.typography.h5
)
OutlinesTextField (
значение = "",
onValueChange = {},
label = {Текст ("Имя")}
)
}
}
Если вы запустите это, вы увидите, что ничего не происходит.Это потому, что TextField
не обновляется - он обновляется при изменении значения параметра и
. Это
из-за того, как композиция и перекомпоновка работают в Compose.
Ключевой термин: Состав: описание пользовательского интерфейса, созданного Jetpack Compose при выполнении составных компонентов.
Исходная композиция: создание композиции путем запуска композитные материалы впервые.
Перекомпоновка: повторный запуск компонентов для обновления композиции при изменении данных.
Чтобы узнать больше о начальной композиции и перекомпоновке, см. Думая в сочинении.
Состояние в составных частях
Составные функции могут сохранять в памяти один объект с помощью помню
составной. Значение, вычисленное с помощью запоминающего
, сохраняется в композиции во время
начальная композиция, а сохраненное значение возвращается во время перекомпоновки. помните, что
можно использовать для хранения как изменяемых, так и неизменяемых объектов.
запомнить
сохраняет объекты в композиции и забывает объект, когда
составной объект, который называется , помнит, что
удаляется из композиции. mutableStateOf
создает наблюдаемый MutableState
,
который является наблюдаемым типом, интегрированным со средой выполнения compose.
интерфейс MutableState : State {
переопределить значение переменной: T
}
Любые изменения в значении
будут планировать перекомпоновку любых составляемых функций
которые читают значение
. В случае ExpandingCard
, всякий раз, когда расширяет
изменения,
это вызывает перекомпоновку ExpandingCard
.
Есть три способа объявить объект MutableState
в компонуемом объекте:
-
val mutableState = запомнить {mutableStateOf (по умолчанию)}
-
значение var по запоминанию {mutableStateOf (по умолчанию)}
-
val (значение, setValue) = запомнить {mutableStateOf (по умолчанию)}
Эти объявления эквивалентны и предоставляются в качестве синтаксического сахара для различные варианты использования состояния. Вы должны выбрать тот, который производит самый простой для чтения код в компонуемом компоненте, который вы пишете.
Синтаксис делегата на
требует следующего импорта:
импорт androidx.compose.runtime.getValue
импортировать androidx.compose.runtime.setValue
Вы можете использовать запомненное значение как параметр для других компонентов или даже как
логика в операторах для изменения отображаемых составных элементов. Например, если
вы не хотите отображать приветствие, если имя пустое, используйте состояние в if
выписка:
@Composable
fun HelloContent () {
Столбец (модификатор = Модификатор.padding (16.dp)) {
имя переменной запомните {mutableStateOf ("")}
if (name.isNotEmpty ()) {
Текст(
text = "Привет, $ name!",
modifier = Modifier.padding (bottom = 8.dp),
style = MaterialTheme.typography.h5
)
}
OutlinesTextField (
значение = имя,
onValueChange = {name = it},
label = {Текст ("Имя")}
)
}
}
Хотя помнит, что
помогает сохранять состояние при перекомпоновке, состояние не
сохраняется при изменении конфигурации.Для этого вы должны использовать запомнить Сохранение
. RememberSaveable
автоматически сохраняет любое значение, которое может быть
сохранено в пакете
. Для других значений вы можете передать настраиваемый объект заставки.
Другие поддерживаемые типы состояний
Jetpack Compose не требует использования MutableState
для хранения состояния.
Jetpack Compose поддерживает другие наблюдаемые типы. Перед прочтением другого
наблюдаемый тип в Jetpack Compose, вы должны преобразовать его в состояние State
, чтобы
Jetpack Compose может автоматически перекомпоноваться при изменении состояния.
Составьте корабли с функциями для создания State
из общих наблюдаемых типов
используется в приложениях для Android:
Вы можете создать функцию расширения для Jetpack Compose, чтобы читать другие наблюдаемые объекты.
типы, если ваше приложение использует настраиваемый наблюдаемый класс. См. Реализацию
встроенные функции для примеров того, как это сделать. Любой объект, который позволяет Jetpack Compose
для подписки на каждое изменение можно преобразовать в состояние State
и прочитать его
составной.
Ключевой момент: Compose автоматически перекомпоновывается после чтения Состояние
объекты.
Если вы используете другой наблюдаемый тип, например LiveData
в
Составьте, вы должны преобразовать его в состояние State
, прежде чем читать
в компонуемом виде с помощью функции расширения, например LiveData
.
Осторожно: Использование изменяемых объектов, таких как ArrayList
или mutableListOf ()
как состояние в
Compose приведет к тому, что ваши пользователи увидят неверные или устаревшие данные в вашем приложении.
Изменяемые объекты, которые нельзя наблюдать, например ArrayList
или изменяемый класс данных, не может быть обнаружен
Compose запускает перекомпоновку, когда они меняются.
Вместо использования ненаблюдаемых изменяемых объектов мы рекомендуем использовать
наблюдаемый держатель данных, такой как State
и
неизменяемый >
listOf ()
.
Stateful в сравнении с сохранением состояния
Составной объект, который использует запоминание
для хранения объекта, создает внутреннее состояние,
создание составного с сохранением состояния . HelloContent
- пример с отслеживанием состояния
составной, потому что он сохраняет и изменяет свое имя
состояние внутри. Это может
быть полезным в ситуациях, когда вызывающему абоненту не нужно контролировать состояние и он может
использовать его без необходимости самостоятельно управлять состоянием. Однако совместимость с
внутреннее состояние, как правило, менее пригодно для повторного использования и труднее тестировать.
Составной компонент без сохранения состояния - это составной компонент, не содержащий состояния. Легко способ добиться безгражданства - использовать состояние подъем.
Когда вы разрабатываете повторно используемые компоненты, вы часто хотите предоставить как и версия того же составного объекта без сохранения состояния. Версия с сохранением состояния удобно для абонентов, которым нет дела до состояния, и для лиц без гражданства версия необходима для вызывающих абонентов, которым необходимо контролировать или поднимать состояние.
Государственный подъемник
Поднятие состояния в Compose - это шаблон перемещения состояния к вызывающему компоненту чтобы сделать составной объект без состояния. Общая схема подъема состояния в Jetpack Compose заменяет переменную состояния двумя параметрами:
-
значение: T
: текущее значение для отображения -
onValueChange: (T) -> Unit
: событие, которое запрашивает изменение значения, гдеT
- предлагаемое новое значение
Однако вы не ограничены onValueChange
.Если более конкретные события
подходит для составного, вы должны определить их, используя лямбды, такие как ExpandingCard
работает с onExpand
и onCollapse
.
Состояние, которое поднимается таким образом, имеет несколько важных свойств:
- Единый источник истины: Перемещая состояние вместо его дублирования, мы обеспечение только одного источника истины. Это помогает избежать ошибок.
- Инкапсулировано: Только составные объекты с отслеживанием состояния смогут изменять свои штат.Это полностью внутреннее.
- Совместное использование: Поднятое состояние может использоваться несколькими компонентами. Скажи мы
хотел, чтобы
назвал
в другом компонуемом файле, подъем позволил бы нам сделать тот. - Interceptable: вызывающие компоненты без сохранения состояния могут решить игнорировать или изменять события перед изменением состояния.
- Decoupled: состояние для не имеющего состояния
ExpandingCard
может быть сохранено где угодно. Например, теперь можно переместитьname
вViewModel
.
В данном примере вы извлекаете имя
и onValueChange
из HelloContent
и переместите их вверх по дереву на HelloScreen
, который
вызывает HelloContent
.
@Composable
fun HelloScreen () {
имя переменной от RememberSaveable {mutableStateOf ("")}
HelloContent (name = name, onNameChange = {name = it})
}
@Composable
весело HelloContent (name: String, onNameChange: (String) -> Unit) {
Столбец (модификатор = Модификатор.padding (16.dp)) {
Текст(
text = "Привет, $ name",
modifier = Modifier.padding (bottom = 8.dp),
style = MaterialTheme.typography.h5
)
OutlinesTextField (
значение = имя,
onValueChange = onNameChange,
label = {Текст ("Имя")}
)
}
}
Поднимая состояние из HelloContent
, легче рассуждать о
составной, повторно используйте его в разных ситуациях и протестируйте. HelloContent
- это
независимо от того, как его состояние хранится.Разделение означает, что если вы измените или
замените HelloScreen
, вам не нужно менять, как HelloContent
реализовано.
Паттерн, при котором состояние понижается, а события растут, называется однонаправленный поток данных . В этом случае состояние понижается с HelloScreen
до HelloContent
, а события повышаются с HelloContent
до HelloScreen
. По
следуя однонаправленному потоку данных, вы можете разделить составные элементы, отображающие
состояние в пользовательском интерфейсе из частей вашего приложения, которые хранят и изменяют состояние.
Ключевой момент: При поднятии состояния существуют три правила, которые могут помочь вы выясняете, куда должно идти состояние:
- Состояние должно быть повышено до минимум наименьшего общего родительский всех компонентов, которые используют состояние (чтение).
- Состояние должно быть поднято до минимум наивысшего уровня, который он может заменить (написать).
- Если два состояния изменяются в ответ на одни и те же события , они должны быть подняты вместе.
Вы можете поднять состояние выше, чем требуют эти правила, но не поднять состояние затруднит или сделает невозможным отслеживание однонаправленных данных поток.
ViewModel и состояние
ViewModels - рекомендуемые держатели состояний для композитных материалов, находящихся на высоком уровне дерево пользовательского интерфейса Compose или составные элементы, которые являются пунктами назначения в навигации библиотека. ViewModels сохраняют изменения конфигурации, поэтому они позволяют инкапсулировать состояние и события, связанные с пользовательским интерфейсом, без необходимости иметь дело с жизненный цикл активности или фрагмента, на котором размещается ваш код Compose.
Примечание. Чтобы узнать больше о том, как использовать навигацию с Compose, см. Раздел «Навигация». с помощью Compose. Чтобы узнать больше о том, как ViewModels связаны с жизненным циклом представления Android и Compose, см. Compose совместимость. Ваши ViewModels должны отображать состояние в наблюдаемом держателе, таком как LiveData
или StateFlow
. Когда объект состояния читается во время композиции,
текущий объем перекомпоновки композиции автоматически подписывается на
обновления этого объекта состояния.
У вас может быть один или несколько наблюдаемых держателей состояния - каждый из них должен владеть состояние для частей экрана, которые концептуально связаны и которые меняются все вместе. Таким образом, вы сохраните единый источник истины, даже если состояние используется в нескольких составных объектах.
Вы можете использовать LiveData
и ViewModel
в Jetpack Compose для реализации
однонаправленный поток данных. Пример HelloScreen
будет реализован с использованием ViewModel
как это:
class HelloViewModel: ViewModel () {
// LiveData хранит состояние, которое наблюдает пользовательский интерфейс
// (состояние стекает из ViewModel)
частный val _name = MutableLiveData ("")
имя val: LiveData = _name
// onNameChange - это определяемое нами событие, которое пользовательский интерфейс может вызывать
// (события исходят из пользовательского интерфейса)
fun onNameChange (newName: String) {
_название.значение = новое имя
}
}
@Composable
весело HelloScreen (helloViewModel: HelloViewModel = viewModel ()) {
// по умолчанию viewModel () следует за жизненным циклом как за действием или фрагментом
// который вызывает HelloScreen (). Этот жизненный цикл может быть изменен вызывающими HelloScreen.
// имя - текущее значение [helloViewModel.name]
// с начальным значением ""
имя val: строка от helloViewModel.name.observeAsState ("")
HelloContent (name = name, onNameChange = {helloViewModel.onNameChange (it)})
}
@Composable
весело HelloContent (name: String, onNameChange: (String) -> Unit) {
Столбец (модификатор = Модификатор.padding (16.dp)) {
Текст(
text = "Привет, $ name",
modifier = Modifier.padding (bottom = 8.dp),
style = MaterialTheme.typography.h5
)
OutlinesTextField (
значение = имя,
onValueChange = onNameChange,
label = {Текст ("Имя")}
)
}
}
Наблюдать за государством
наблюдает за LiveData
и возвращает обновленный объект State
всякий раз, когда изменяется LiveData
. State
- наблюдаемый тип, который Jetpack
Compose можно использовать напрямую. ObserverAsState
будет наблюдать LiveData только в то время как
он есть в составе.
на
) для неявной обработки State
как объектов типа T
в Jetpack
Сочинять.Линия:
val name: строка, созданная helloViewModel.name.observeAsState ("")
... это синтаксический сахар для автоматического разворачивания возвращаемого объекта состояния
автор: ObserverAsState
.Вы также можете назначить объект состояния с помощью присвоения
оператор ( =
), что делает его State
вместо String
:
val nameState: Состояние = helloViewModel.name.observeAsState ("")
Восстановление состояния в Compose
Используйте RememberSaveable
, чтобы восстановить состояние пользовательского интерфейса после действия или процесса
воссоздан. RememberSaveable
сохраняет состояние после перекомпоновки.Кроме того, RememberSaveable
также сохраняет состояние
через деятельность и процесс отдыха.
Способы хранения состояния
Все типы данных, которые добавляются к Bundle
, сохраняются автоматически. если ты
хотите сохранить то, что нельзя добавить в Bundle
, есть несколько
опции.
Участок
Самое простое решение - добавить @Parcelize
аннотация к объекту. Объект становится посылочным, и его можно связать.Для
Например, этот код создает пакетный тип данных City
и сохраняет его в
штат.
@Parcelize
класс данных City (имя val: строка, страна val: строка): Parcelable
@Composable
fun CityScreen () {
var selectedCity = RememberSaveable {
mutableStateOf (Город ("Мадрид", "Испания"))
}
}
MapSaver
Если по какой-либо причине @Parcelize
не подходит, вы можете использовать mapSaver
для
определите собственное правило преобразования объекта в набор значений, которые
Система может сохранять в Bundle
.
класс данных Город (имя val: строка, страна val: строка)
val CitySaver = run {
val nameKey = "Имя"
val countryKey = "Страна"
mapSaver (
save = {mapOf (nameKey to it.name, countryKey to it.country)},
restore = {Город (он [nameKey] как String, он [countryKey] как String)}
)
}
@Composable
fun CityScreen () {
var selectedCity = RememberSaveable (stateSaver = CitySaver) {
mutableStateOf (Город ("Мадрид", "Испания"))
}
}
ListSaver
Чтобы избежать необходимости определять ключи для карты, вы также можете использовать listSaver
и использовать его индексы в качестве ключей:
класс данных City (имя val: строка, страна val: строка)
val CitySaver = listSaver <Город, Любой> (
save = {listOf (это.имя, it.country)},
restore = {Город (он [0] как Строка, он [1] как Строка)}
)
@Composable
fun CityScreen () {
var selectedCity = RememberSaveable (stateSaver = CitySaver) {
mutableStateOf (Город ("Мадрид", "Испания"))
}
}
Узнать больше
Чтобы узнать больше о состоянии и Jetpack Compose, выберите Using State в Jetpack. Составьте codelab.
Версии файла Compose и обновление
Расчетное время чтения: 15 минут
Файл Compose - это файл YAML, определяющий службы, сети и тома для приложения Docker.
Форматы файлов Compose теперь описаны в этих справочных материалах для каждой версии.
В следующих темах объясняются различия между версиями Docker Engine. совместимость и способ обновления.
Матрица совместимости
Существует несколько версий формата файла Compose - 1, 2, 2.x и 3.x
В этой таблице показано, какие версии файлов Compose поддерживают определенные выпуски Docker.
Составить формат файла | Версия Docker Engine |
---|---|
Составить спецификацию | 19.03.0+ |
3,8 | 19.03.0+ |
3,7 | 18.06.0+ |
3,6 | 18.02.0+ |
3,5 | 17.12.0+ |
3,4 | 17.09.0+ |
3,3 | 17.06.0+ |
3,2 | 17.04.0+ |
3,1 | 1.13.1+ |
3,0 | 1.13.0+ |
2,4 | 17.12.0+ |
2,3 | 17.06.0+ |
2,2 | 1.13.0+ |
2,1 | 1.12.0+ |
2,0 | 1.10.0+ |
В дополнение к версиям формата файла Compose, указанным в таблице, функция Compose сам находится в графике выпуска, как показано в Compose выпуски, но версии в формате файлов не обязательно увеличивать с каждым выпуском.Например, формат файла Compose 3.0 был впервые представлен в выпуске Compose 1.10.0 и версиями постепенно в последующих выпусках.
Последний формат файла Compose определяется спецификацией Compose и реализован в Docker Compose 1.27.0+ .
Ищете более подробную информацию о совместимости Docker и Compose?
Мы рекомендуем как можно чаще обновлять новейшие версии. Однако, если вы используете старую версию Docker и хотите определить, какой Версия Compose совместима, см. Версию Compose Примечания.Каждый набор примечаний к выпуску дает подробную информацию о том, какие версии Docker Engine поддерживаются, а также с совместимыми версиями формата файла Compose. (См. Также обсуждение в выпуск №3404.)
Подробнее о версиях и способах обновления см. Управление версиями и Обновление.
Управление версиями
Существуют три устаревшие версии формата файла Compose:
Версия 1. Это определяется путем пропуска ключа
версии
в корне YAML.Версия 2.x. Это указывается с версией
: '2',
или версией: '2.1',
и т. Д., Записью в корне YAML.версии 3.x, предназначенной для перекрестной совместимости между Compose и Docker Engine. режим роя. Это указывается с версией
: '3',
или версией: '3.1',
и т. Д., Записью в корне YAML.
Последняя и рекомендуемая версия формата файла Compose определяется спецификацией Compose.Этот формат объединяет версии 2.x и 3.x и реализован в Compose 1.27.0+ .
v2 и v3 Декларация
Примечание : при указании версии файла Compose для использования убедитесь, что укажите и старший номер , и младший номер . Если дополнительная версия не указана,
0
используется по умолчанию, а не последняя дополнительная версия.
Матрица совместимости показывает версии файлов Compose, сопоставленные с выпусками Docker Engine.
Чтобы перенести проект на более позднюю версию, см. Обновление раздел.
Примечание : если вы используете несколько файлов Compose или расширяющие службы, каждый файл должен быть одна и та же версия - вы не можете, например, смешивать версии 1 и 2 в одном проект.
Некоторые вещи различаются в зависимости от того, какую версию вы используете:
- Структура и разрешенные ключи конфигурации
- Минимальная версия Docker Engine, которую вы должны использовать
- Поведение Compose в отношении сети
Эти различия объясняются ниже.
Версия 1 (устарело)
Файлы Compose, в которых не указана версия, считаются «версией 1». В тех файлы, все сервисы объявлен в корне документа.
Версия 1 поддерживается Compose до 1.6.x . Он будет объявлен устаревшим в будущий релиз Compose.
Файлы версии 1 не могут объявить именованные тома, сети или строить аргументы.
Compose не использует преимущества сети, когда вы
использовать версию 1: каждый контейнер помещается в сеть моста по умолчанию и
доступный из любого другого контейнера по его IP-адресу.Вам нужно использовать
связывает
, чтобы разрешить обнаружение между контейнерами.
Пример:
Интернет:
строить: .
порты:
- «5000: 5000»
объемы:
-.: / код
ссылки:
- Redis
Redis:
изображение: redis
Версия 2
Файлы компоновки с использованием синтаксиса версии 2 должны указывать номер версии на
корень документа. Все услуги
должны быть заявлены под ключом services
.
версии 2 поддерживаются Compose 1.6.0+ и требуется Docker Engine версии 1.10.0+ .
Именованные тома могут быть объявлены под тома
ключ, и сети можно декларировать
под сети
ключ.
По умолчанию каждый контейнер присоединяется к сети по умолчанию в масштабе всего приложения и является обнаруживается на имени хоста, которое совпадает с именем службы. Это означает ссылки в основном не нужны. Подробнее см. Сеть в Compose.
Примечание
При указании используемой версии файла Compose убедитесь, что укажите и старший номер , и младший номер .Если дополнительная версия не указана,
0
используется по умолчанию, а не последняя дополнительная версия. В результате функции, добавленные в более поздних версиях, не будут поддерживаться. Например:эквивалентно:
Простой пример:
версия: "2.4"
Сервисы:
Интернет:
строить: .
порты:
- «5000: 5000»
объемы:
-.: / код
Redis:
изображение: redis
Более расширенный пример определения томов и сетей:
версия: «2.4 "
Сервисы:
Интернет:
строить: .
порты:
- «5000: 5000»
объемы:
-.: / код
сети:
- передний ярус
- задний ярус
Redis:
изображение: redis
объемы:
- redis-data: / var / lib / redis
сети:
- задний ярус
объемы:
redis-data:
водитель: местный
сети:
передний ярус:
водитель: мост
задний ярус:
водитель: мост
Было добавлено несколько других опций для поддержки сети, например:
псевдонимы
Параметр
depends_on
может использоваться вместо ссылок для обозначения зависимостей. между услугами и порядком запуска.версия: "2.4" Сервисы: Интернет: строить: . зависит от: - дб - Redis Redis: изображение: redis db: изображение: postgres
ipv4_адрес
,ipv6_address
Замена переменной также была добавлена в версии 2.
Версия 2.1
Обновление версии 2, которое вводит только новые параметры доступно с Docker Engine версии 1.12.0+ . Файлы версии 2.1 поддерживается Compose 1.9.0+ .
Вводит следующие дополнительные параметры:
Версия 2.2
Обновление версии 2.1, в которой представлены только новые параметры. доступно с Docker Engine версии 1.13.0+ . Файлы версии 2.2 поддерживается Compose 1.13.0+ . Эта версия также позволяет указать номера шкалы по умолчанию в конфигурации службы.
Вводит следующие дополнительные параметры:
Версия 2.3
Обновление версии 2.2, которое вводит только новые параметры доступно с Docker Engine версии 17.06.0+ . Файлы версии 2.3 поддерживается Compose 1.16.0+ .
Вводит следующие дополнительные параметры:
Версия 2.4
Обновление версии 2.3, в которой представлены только новые параметры. доступно с Docker Engine версии 17.12.0+ . Файлы версии 2.4 поддерживается Compose 1.21.0+ .
Вводит следующие дополнительные параметры:
-
платформа
для определений услуг - Поддержка полей расширения в корне службы, сети и тома определения
Версия 3
Предназначен для перекрестной совместимости между Compose и Docker Engine. режим роя, версия 3 удаляет несколько опций и добавляет еще несколько.
Удалено:
volume_driver
,volume_from
,cpu_shares
,cpu_quota
,cpuset
,mem_limit
,memswap_limit
,extends
,group_add
. Видеть руководство по обновлению, чтобы узнать, как отказаться от них. (Для получения дополнительной информации оextends
см. Расширение услуг.)Добавлено: развертывание
Примечание : при указании версии файла Compose для использования убедитесь, что укажите и старший номер , и младший номер .Если дополнительная версия не указана,
0
используется по умолчанию, а не последняя дополнительная версия. В результате в более поздние версии не поддерживаются. Например:эквивалентно:
Версия 3.1
Обновление версии 3, которое вводит только новые параметры доступно с Docker Engine версии 1.13.1+ и выше.
Вводит следующие дополнительные параметры:
Версия 3.2
Обновление версии 3, которое вводит только новые параметры доступно с Docker Engine версии 17.04.0+ и выше.
Вводит следующие дополнительные параметры:
Версия 3.3
Обновление версии 3, которое вводит только новые параметры доступно с Docker Engine версии 17.06.0+ и выше.
Вводит следующие дополнительные параметры:
Версия 3.4
Обновление версии 3, которое вводит новые параметры. это доступно только с Docker Engine версии 17.09.0 и выше.
Вводит следующие дополнительные параметры:
Версия 3.5
Обновление версии 3, которое вводит новые параметры. это доступно только с Docker Engine версии 17.12.0 и выше.
Вводит следующие дополнительные параметры:
Версия 3.6
Обновление версии 3, которое вводит новые параметры. это доступно только с Docker Engine версии 18.02.0 и выше.
Вводит следующие дополнительные параметры:
Версия 3.7
Обновление версии 3, которое вводит новые параметры. это доступно только с Docker Engine версии 18.06.0 и выше.
Вводит следующие дополнительные параметры:
-
init
в определениях услуг -
rollback_config
в конфигурациях развертывания - Поддержка полей расширения в корне службы, сети, тома, секрета и определения конфигурации
Версия 3.8
Обновление версии 3, которое вводит новые параметры.это доступно только с Docker Engine версии 19.03.0 и выше.
Вводит следующие дополнительные параметры:
-
max_replicas_per_node
в размещении конфигурации -
template_driver
опция для конфигурации и секретные конфигурации. Этот опция поддерживается только при развертывании служб роя с использованиемстек докеров развернуть
. -
драйвер
иdriver_opts
вариант для секрета конфигурации.Эта опция поддерживается только при развертывании служб роя. используя стек докеров, разверните
.
Обновление
Версии от 2.x до 3.x
Между версиями 2.x и 3.x структура файла Compose одинакова, но убрано несколько опций:
volume_driver
: вместо установки драйвера тома для службы определите том с использованием топ-уровеньтома
опцион и укажите там драйвер.версия: "3.9" Сервисы: db: изображение: postgres объемы: - данные: / var / lib / postgresql / data объемы: данные: драйвер: mydriver
volume_from
: Чтобы разделить том между сервисами, определите его с помощью топ-уровеньтома
опцион и ссылаться на него из каждой службы, которая его разделяет, используя уровень обслуживаниятома
вариант.cpu_shares
,cpu_quota
,cpuset
,mem_limit
,memswap_limit
: Эти были заменены ключом ресурсов подразвернуть
.РазвертываниеКонфигурация
вступает в силу только при использованииdocker stack deploy
и игнорируетсяdocker-compose
.-
extends
: Этот параметр был удален для версии: "3.x"
Составляйте файлы. (Для получения дополнительной информации см. Расширение услуг.) -
group_add
: Эта опция была удалена для версии: "3.x"
Компоновка файлов. -
pids_limit
: Эта опция не была введена в версии: «3.x "
Создание файлов. -
link_local_ips
в сетяхверсия: "3.x"
Составлять файлы.
Версии с 1 по 2.x
В большинстве случаев переход с версии 1 на 2 очень простой процесс:
- Сделайте отступ для всего файла на один уровень и поместите вверху клавишу
services:
. - Добавьте строку
версии: '2'
вверху файла.
Сложнее, если вы используете определенные функции конфигурации:
dockerfile
: теперь он находится под ключом сборкисборка: контекст:.dockerfile: Dockerfile-alternate
log_driver
,log_opt
: теперь они живут под ключомведения журнала
:регистрация: драйвер: системный журнал опции: адрес системного журнала: "tcp: //192.168.0.42: 123"
связывает
с переменными среды: переменные среды, созданные ссылки, такие какCONTAINERNAME_PORT
, `устарели в течение некоторого времени.В новой сетевой системе Docker они были удалены. Вы должны либо подключиться напрямую к соответствующее имя хоста или самостоятельно установите соответствующую переменную среды, используя ссылку hostname:Интернет: ссылки: - дб окружающая обстановка: - DB_PORT = tcp: // db: 5432
external_links
: Compose использует сети Docker при запуске версии 2 проекты, поэтому ссылки ведут себя немного иначе. В частности, два контейнеры должны быть подключены хотя бы к одной общей сети, чтобы общаться, даже если они явно связаны друг с другом.Подключите внешний контейнер к сеть по умолчанию или подключите внешний контейнер и контейнеров вашей службы в внешняя сеть.
net
: теперь заменено на network_mode:сеть: хост -> режим_сети: хост сеть: мост -> режим_сети: мост net: none -> network_mode: none
Если вы используете
net: "container: [название службы]"
, теперь вы должны использоватьnetwork_mode: "service: [название службы]" вместо
.net: "container: web" -> network_mode: "service: web"
Если вы используете
net: "container: [имя / идентификатор контейнера]"
, значение не будет нужно изменить.net: "container: cont-name" -> network_mode: "container: cont-name" net: "container: abc12345" -> network_mode: "container: abc12345"
тома
с именованными томами: теперь они должны быть явно объявлены в раздел верхнего уровнятома
вашего файла Compose.Если сервис устанавливает именованный том с именемdata
, вы должны объявить томdata
в своем верхнего уровнятома
раздела. Весь файл может выглядеть так:версия: "2.4" Сервисы: db: изображение: postgres объемы: - данные: / var / lib / postgresql / data объемы: данные: {}
По умолчанию Compose создает том с префиксом вашего имени. название проекта. Если вы хотите, чтобы он просто назывался
data
, объявите его как внешний:тома: данные: внешний: правда
Режим совместимости
docker-compose
1.20.0 представляет новый флаг --compatibility
, предназначенный для
помочь разработчикам упростить переход на версию 3. При включении docker-compose
читает раздел deploy
определения каждой службы и
пытается преобразовать его в эквивалентный параметр версии 2. В настоящее время,
переведены следующие ключи развертывания:
Все остальные клавиши игнорируются и выдают предупреждение, если они присутствуют. Вы можете просмотреть
конфигурация, которая будет использоваться для развертывания с использованием --compatibility
флаг с помощью команды config
.
Не используйте это в производстве!
Мы не рекомендуем использовать режим
--compatibility
в производстве. Поскольку итоговая конфигурация является приблизительной с использованием режима без роя. свойства, это может привести к неожиданным результатам.
Составить ссылки на формат файла
fig, композиция, композиция, версии, обновление, dockerУчебное пособие по загрузке и обработке данных - PyTorch Tutorials 0.2.0_4 документация
Автор : Сасанк Чиламкурти
Много усилий для решения любой задачи машинного обучения вкладывается в подготовка данных.PyTorch предоставляет множество инструментов для загрузки данных. легко и, надеюсь, сделает ваш код более читабельным. В этом руководстве мы увидим, как загружать и предварительно обрабатывать / дополнять данные из нетривиального набор данных.
Чтобы запустить это руководство, убедитесь, что следующие пакеты установлено:
-
scikit-image
: для изображения io и преобразования -
pandas
: Для упрощения синтаксического анализа csv
из __future__ import print_function, Division импорт ОС импортный фонарик импортировать панд как pd из skimage import io, преобразовать импортировать numpy как np import matplotlib.pyplot как plt из torch.utils.data import Dataset, DataLoader из torchvision import transforms, utils # Игнорировать предупреждения предупреждения об импорте warnings.filterwarnings ("игнорировать") plt.ion () # интерактивный режим
Набор данных, с которым мы будем иметь дело, - это поза лица. Это означает, что лицо аннотируется следующим образом:
Всего для каждого лица аннотировано 68 различных ориентиров.
Примечание
Загрузите набор данных отсюда чтобы изображения находились в каталоге с именем «faces /».Этот набор данных был на самом деле сгенерировано применением отличной позы dlib оценка на нескольких изображениях с сайта imagenet с тегом "лицо".
Набор данныхпоставляется с файлом csv с аннотациями, который выглядит следующим образом:
имя_образа, part_0_x, part_0_y, part_1_x, part_1_y, part_2_x, ..., part_67_x, part_67_y 0805personali01.jpg, 27,83,27,98, ... 84,134 1084239450_e76e00b7e7.jpg, 70,236,71,257, ..., 128,312
Давайте быстро прочитаем CSV и получим аннотации в массиве (N, 2), где N количество ориентиров.
landmarks_frame = pd.read_csv ('faces / face_landmarks.csv') n = 65 img_name = landmarks_frame.ix [n, 0] landmarks = landmarks_frame.ix [n, 1:]. as_matrix (). astype ('float') landmarks = landmarks.reshape (-1, 2) print ('Имя изображения: {}'. формат (img_name)) print ('Форма ориентира: {}'. format (landmarks.shape)) print ('Первые 4 ориентира: {}'. формат (ориентиры [: 4]))
Давайте напишем простую вспомогательную функцию для отображения изображения и его ориентиров. и используйте его, чтобы показать образец.
def show_landmarks (изображение, ориентиры): "" "Показать изображение с достопримечательностями" "" plt.imshow (изображение) plt.scatter (ориентиры [:, 0], ориентиры [:, 1], s = 10, marker = '.', c = 'r') plt.pause (0.001) # немного приостановить, чтобы графики обновились plt.figure () show_landmarks (io.imread (os.path.join ('faces /', img_name)), ориентиры) plt.show ()
Класс набора данных
torch.utils.data.Dataset
- абстрактный класс, представляющий
набор данных.
Ваш собственный набор данных должен унаследовать Dataset
и переопределить следующие
методы:
-
__len__
, так чтоlen (набор данных)
возвращает размер набора данных. -
__getitem__
для поддержки индексации, чтобы набор данных[i]
мог использоваться для получения \ (i \) -го образца
Давайте создадим класс набора данных для нашего набора данных ориентиров лиц. Мы будем
прочтите csv в __init__
, но оставьте чтение изображений __getitem__
. Это эффективно с точки зрения памяти, потому что не все изображения
хранятся в памяти сразу, но читаются по мере необходимости.
Образец нашего набора данных будет диктовкой {'изображение': изображение, 'ориентиры': ориентиры}
.Наш набор данных займет
необязательный аргумент преобразовать
, чтобы любая необходимая обработка могла быть
нанесен на образец. Мы увидим полезность преобразования
в
следующий раздел.
класс FaceLandmarksDataset (набор данных): "" "Набор данных Face Landmarks." "" def __init __ (self, csv_file, root_dir, transform = None): "" " Аргументы: csv_file (строка): путь к файлу csv с аннотациями. root_dir (строка): Каталог со всеми изображениями.transform (callable, optional): дополнительное преобразование, которое будет применяться по образцу. "" " self.landmarks_frame = pd.read_csv (csv_file) self.root_dir = корневой_ каталог self.transform = преобразовать def __len __ (сам): вернуть len (self.landmarks_frame) def __getitem __ (self, idx): img_name = os.path.join (self.root_dir, self.landmarks_frame.ix [idx, 0]) изображение = io.imread (img_name) landmarks = self.landmarks_frame.ix [idx, 1:].as_matrix (). astype ('с плавающей точкой') landmarks = landmarks.reshape (-1, 2) sample = {'image': image, 'landmarks': ориентиры} если self.transform: sample = self.transform (образец) вернуть образец
Давайте создадим экземпляр этого класса и переберем образцы данных. Мы распечатает размеры первых 4 образцов и покажет их ориентиры.
face_dataset = FaceLandmarksDataset (csv_file = 'faces / face_landmarks.csv', root_dir = 'лица /') fig = plt.фигура() для i в диапазоне (len (face_dataset)): sample = face_dataset [i] print (i, образец ['изображение']. форма, образец ['ориентиры']. форма) ax = plt.subplot (1, 4, i + 1) plt.tight_layout () ax.set_title ('Образец № {}'. format (i)) ax.axis ('выкл.') show_landmarks (** образец) если я == 3: plt.show () сломать
Преобразовывает
Одна проблема, которую мы видим из вышеизложенного, заключается в том, что образцы не тот же размер. Большинство нейронных сетей ожидают изображения фиксированного размера.Следовательно, нам нужно будет написать некоторый код предварительной обработки. Создадим три преобразования:
-
Изменить масштаб
: масштабировать изображение -
RandomCrop
: для произвольной обрезки изображения. Это данные увеличение. -
ToTensor
: чтобы преобразовать изображения numpy в изображения torch (нам нужно поменять местами оси).
Мы будем писать их как вызываемые классы вместо простых функций, поэтому
что параметры преобразования не нужно передавать каждый раз, когда
называется.Для этого нам просто нужно реализовать метод __call__
и
если требуется, метод __init__
. Затем мы можем использовать такое преобразование:
tsfm = Преобразовать (параметры) transformed_sample = tsfm (образец)
Посмотрите ниже, как эти преобразования применялись как к изображению, так и к ориентиры.
класс Rescale (объект): "" "Измените масштаб изображения в образце до заданного размера. Аргументы: output_size (кортеж или кортеж): желаемый размер вывода. Если кортеж, вывод соответствует output_size.Если int, соответствует меньший из краев изображения to output_size с сохранением соотношения сторон. "" " def __init __ (self, output_size): assert isinstance (output_size, (число, кортеж)) self.output_size = output_size def __call __ (self, sample): изображение, ориентиры = образец ['изображение'], образец ['ориентиры'] h, w = image.shape [: 2] если isinstance (self.output_size, int): если h> w: new_h, new_w = self.output_size * h / w, self.output_size еще: new_h, new_w = self.output_size, self.output_size * w / h еще: new_h, new_w = self.output_size new_h, new_w = int (новый_h), int (новый_w) img = transform.resize (изображение, (new_h, new_w)) # h и w меняются местами на ориентиры, потому что для изображений # Оси x и y - это оси 1 и 0 соответственно landmarks = ориентиры * [новое_н / нед, новое_ч / час] return {'изображение': img, 'ориентиры': ориентиры} класс RandomCrop (объект): "" "Произвольная обрезка изображения в образце.Аргументы: output_size (кортеж или целое число): желаемый размер вывода. Если int, квадратная обрезка сделан. "" " def __init __ (self, output_size): assert isinstance (output_size, (число, кортеж)) если isinstance (output_size, int): self.output_size = (размер_вывода, размер_вывода) еще: assert len (output_size) == 2 self.output_size = output_size def __call __ (self, sample): изображение, ориентиры = образец ['изображение'], образец ['ориентиры'] h, w = изображение.форма [: 2] new_h, new_w = self.output_size top = np.random.randint (0, h - new_h) left = np.random.randint (0, w - новое_w) image = image [вверху: вверху + new_h, left: left + new_w] landmarks = ориентиры - [слева, вверху] return {'изображение': изображение, 'ориентиры': ориентиры} класс ToTensor (объект): "" "Преобразовать ndarrays в выборке в тензоры." "" def __call __ (self, sample): изображение, ориентиры = образец ['изображение'], образец ['ориентиры'] # поменять местами ось цвета, потому что # numpy image: В x Ш x В # изображение фонарика: C X H X W изображение = изображение.транспонировать ((2, 0, 1)) return {'image': torch.from_numpy (изображение), 'ориентиры': torch.from_numpy (ориентиры)}
Составить преобразования
Теперь мы применяем преобразования к образцу.
Допустим, мы хотим изменить масштаб короткой стороны изображения до 256 и
затем случайным образом вырежьте из него квадрат размером 224. то есть мы хотим составить Изменить масштаб преобразований
и RandomCrop
. torchvision.transforms.Compose
- это простой вызываемый класс, который позволяет нам
сделать это.
= Изменить масштаб (256) урожай = RandomCrop (128) Compose = transforms.Compose ([Изменить масштаб (256), RandomCrop (224)]) # Примените каждое из приведенных выше преобразований к образцу. fig = plt.figure () sample = face_dataset [65] для i, tsfrm в enumerate ([масштаб, кадрирование, составлено]): transformed_sample = tsfrm (образец) ax = plt.subplot (1, 3, i + 1) plt.tight_layout () ax.set_title (тип (tsfrm) .__ name__) show_landmarks (** преобразованный_выборка) plt.show ()
Перебор набора данных
Давайте соберем все это вместе и создадим набор данных со скомпонованными трансформируется.Подводя итог, каждый раз, когда производится выборка этого набора данных:
- Изображение считывается из файла на лету
- Преобразования применяются к считанному изображению
- Поскольку одно из преобразований является случайным, данные дополняются выборка
Мы можем перебирать созданный набор данных с для i в диапазоне
петля, как и раньше.
transformed_dataset = FaceLandmarksDataset (csv_file = 'faces / face_landmarks.csv', root_dir = 'лица /', преобразовать = преобразовывает.Составить ([ Изменить масштаб (256), RandomCrop (224), ToTensor () ])) для i в диапазоне (len (transformed_dataset)): sample = transformed_dataset [i] print (i, образец ['изображение']. размер (), образец ['ориентиры']. размер ()) если я == 3: сломать
Однако мы теряем много функций, используя простой цикл для
для
перебирать данные.В частности, мы упускаем:
- Пакетирование данных
- Перемешивание данных
- Загрузите данные параллельно, используя
многопроцессорных
рабочих.
torch.utils.data.DataLoader
- это итератор, который предоставляет все эти
Особенности. Параметры, используемые ниже, должны быть понятными. Один параметр
проценты collate_fn
. Вы можете указать, насколько именно нужны образцы
для пакетирования с использованием collate_fn
. Однако сортировка по умолчанию должна работать
отлично подходит для большинства случаев использования.
dataloader = DataLoader (transformed_dataset, batch_size = 4, shuffle = True, num_workers = 4) # Вспомогательная функция для отображения партии def show_landmarks_batch (sample_batched): "" "Показать изображение с ориентирами для партии образцов." "" images_batch, landmarks_batch = \ sample_batched ['изображение'], sample_batched ['ориентиры'] batch_size = len (images_batch) im_size = images_batch.size (2) сетка = utils.make_grid (images_batch) plt.imshow (grid.numpy ().транспонировать ((1, 2, 0))) для i в диапазоне (batch_size): plt.scatter (landmarks_batch [i,:, 0] .numpy () + i * im_size, landmarks_batch [i,:, 1] .numpy (), s = 10, маркер = '.', c = 'r') plt.title ('Пакет из загрузчика данных') для i_batch, sample_batched в перечислении (загрузчик данных): print (i_batch, sample_batched ['изображение']. size (), sample_batched ['ориентиры']. size ()) # наблюдаем 4-ю партию и останавливаемся. если i_batch == 3: plt.figure () show_landmarks_batch (sample_batched) plt.ось ('выкл') plt.ioff () plt.show () сломать
Послесловие: torchvision
В этом руководстве мы увидели, как писать и использовать наборы данных, преобразовывать
и загрузчик данных. Пакет torchvision
предоставляет некоторые общие наборы данных и
трансформируется. Возможно, вам даже не придется писать собственные классы. Один из
более общие наборы данных, доступные в torchvision, - это ImageFolder
.
Предполагается, что изображения организованы следующим образом:
корень / муравьи / xxx.PNG корень / муравьи / xxy.jpeg корень / муравьи / xxz.png . . . корень / пчелы / 123.jpg корень / пчелы / nsdf3.png корень / пчелы / asd932_.png
, где «муравьи», «пчелы» и т. Д. Являются ярлыками класса. Аналогично общие преобразования
которые работают с PIL.Image
, например RandomHorizontalFlip
, Scale
,
также доступны. Вы можете использовать их для записи загрузчика данных следующим образом:
импортная горелка из torchvision импорт преобразований, наборов данных data_transform = transforms.Compose ([ transforms.RandomSizedCrop (224), трансформируется.RandomHorizontalFlip (), transforms.ToTensor (), transforms.Normalize (среднее = [0,485, 0,456, 0,406], std = [0,229, 0,224, 0,225]) ]) hymenoptera_dataset = наборы данных.ImageFolder (root = 'hymenoptera_data / train', преобразование = преобразование_данных) dataset_loader = torch.utils.data.DataLoader (hymenoptera_dataset, batch_size = 4, shuffle = True, num_workers = 4)
Пример с обучающим кодом см. Учебник по трансферному обучению.
Общее время работы скрипта: (0 минут 0,000 секунд)
Создано в Sphinx-Gallery
Руководство для начинающих по созданию классификатора изображений AI с использованием PyTorch | by Alexander Wu
Это пошаговое руководство по созданию классификатора изображений. Модель AI сможет научиться маркировать изображения. Я использую Python и Pytorch.
Когда мы пишем программу, очень сложно вручную кодировать каждое маленькое действие, которое мы выполняем. Иногда мы хотим использовать пакеты кода, которые уже написали другие люди.Эти упакованные подпрограммы называются библиотеками и могут быть добавлены в нашу программу путем их импорта и последующего обращения к библиотеке позже в коде.
Обычно мы импортируем все библиотеки в начале программы.
Вместо того, чтобы вводить длинное имя библиотеки всякий раз, когда мы ссылаемся на нее, мы можем сократить его до имени по нашему выбору, используя «as».
# Библиотеки импорта
import torch
import torchvision.transforms as transforms
import torchvision.datasets как наборы данных
import torchvision.модели как модели
import torch.nn as nn
import torch.optim as optim
import numpy as np
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
Далее мы хотим импортировать данные изображения наша модель ИИ будет извлекать уроки из.
Но перед этим нам нужно указать изменения, которые мы хотим выполнить с этими изображениями, поскольку та же команда, которая их импортирует, также преобразует данные.
Эти преобразования выполняются с помощью torchvision.преобразует библиотеку. Лучший способ понять преобразования - прочитать документацию здесь. Но я кратко расскажу, что делает каждая команда.
- преобразований. Compose позволяет нам составлять несколько преобразований вместе, поэтому мы можем использовать более одного преобразования.
- transforms.Resize ((255)) изменяет размер изображения так, чтобы самая короткая сторона имела длину 255 пикселей. Другая сторона масштабируется для сохранения соотношения сторон изображения.
- преобразовывает.CenterCrop (224) обрезает центр изображения, так что это квадратное изображение размером 224 на 224 пикселя.
Мы выполняем эти два шага, чтобы все изображения, входящие в нашу модель AI, имели одинаковый размер (модели AI не могут обрабатывать входные данные с разными размерами)
- преобразовывает. ToTensor () преобразует наше изображение в числа. Как оно это делает?
- Он разделяет три цвета, из которых состоит каждый пиксель нашего изображения: красный, зеленый и синий. По сути, это превращает одно изображение в три изображения (одно с красным оттенком, одно зеленое, одно синее).
- Затем он преобразует пиксели каждого тонированного изображения в яркость их цвета от 0 до 255. Эти значения делятся на 255, поэтому они могут находиться в диапазоне от 0 до 1. Наше изображение теперь является тензором Torch. (структура данных, в которой хранится множество чисел).
- transforms.Normalize (mean = [0,485, 0,456, 0,406], std = [0,229, 0,224, 0,225]) вычитает среднее из каждого значения и затем делит на стандартное отклонение.
- Мы будем использовать предварительно обученную модель, поэтому нам нужно использовать средства и стандартные отклонения, указанные в Pytorch.Для каждого изображения RGB есть три значения среднего и стандартного отклонения.
# Укажите преобразования с помощью torchvision.transforms как преобразования
# librarytransformations = transforms.Compose ([
transforms.Resize (255),
transforms.CenterCrop (224),
transforms.ToTensor (),
transforms.Normalize (mean) = [0,485, 0,456, 0,406], std = [0,229, 0,224, 0,225])
])
Наконец, мы можем импортировать наши изображения в программу. Мы используем библиотеку torchvision.datasets.
Прочтите об этом здесь.
Мы указываем два разных набора данных: один для изображений, на которых ИИ учится (обучающий набор), а другой - для набора данных, который мы используем для тестирования модели ИИ (набор проверки).
Команда datasets.ImageFolder () ожидает, что наши данные будут организованы следующим образом: root / label / picture.png. Другими словами, изображения следует рассортировать по папкам. Например, все изображения пчел должны быть в одной папке, все изображения муравьев - в другой и т. Д.
Мы даем команде
- путь ко всем папкам и
- преобразованиям, которые мы указали на предыдущем шаге.
# Загрузить в каждый набор данных и применить преобразования, используя
# наборы torchvision.datasets как наборы данных librarytrain_set = datasets.ImageFolder ("root / label / train", transform = transformations) val_set = datasets.ImageFolder ("root / label / valid ", transform = transformations)
Затем мы хотим поместить наши импортированные изображения в Dataloader.
Dataloader может выдавать случайные выборки наших данных, поэтому нашей модели не придется каждый раз иметь дело со всем набором данных. Это делает обучение более эффективным.
Мы указываем, сколько изображений мы хотим одновременно, в нашем batch_size (поэтому 32 означает, что мы хотим получить 32 изображения одновременно). Мы также хотим перетасовать наши изображения, чтобы они случайным образом вводились в нашу модель ИИ.
Прочтите о DataLoader здесь.
# Вставить в загрузчик данных с помощью библиотеки torchtrain_loader = torch.utils.data.DataLoader (train_set, batch_size = 32, shuffle = True) val_loader = torch.utils.data.DataLoader (val_set, batch_size = 32, shuffle = True)
Модели ИИ необходимо обучить на большом количестве данных, чтобы быть эффективным. Поскольку у нас не так много данных, мы хотим взять предварительно обученную модель (модель, которая ранее была обучена на многих изображениях), но адаптировать ее для распознавания наших конкретных изображений. Этот процесс называется трансферным обучением.
Модели распознавания изображений состоят из двух частей:
- сверточной части и
- классифицирующей части
Мы хотим сохранить предварительно обученную сверточную часть, но добавить наш собственный классификатор.Вот почему:
Раздел свертки / объединения нашей модели используется для распознавания функций внутри изображения. Сначала он определяет края, затем, используя края, он определяет формы и с помощью форм может идентифицировать объекты.
Но для обучения этого раздела требуется МНОГО данных - вероятно, больше, чем у нас - поэтому вместо этого мы можем использовать предварительно обученные сверточные слои по умолчанию. Эти предварительно обученные сверточные слои были обучены очень хорошо определять эти особенности, независимо от того, какое у вас изображение.
Есть также объединение слоев между сверточными слоями, которые сокращают изображение до меньшего размера, чтобы его можно было легко ввести в наш классификатор.
Последняя часть модели - классификатор. Классификатор берет всю информацию, извлеченную из фотографии в части свертки, и использует ее для идентификации изображения. Это часть предварительно обученной модели, которую мы хотим заменить и обучить на наших собственных изображениях. Это делает модель адаптированной для идентификации изображений, которые мы ей даем.
Мы используем библиотеку torchvision.models для загрузки предварительно обученной модели. Мы можем загрузить много разных моделей, и здесь можно найти дополнительную информацию. Я выбрал модель под названием densenet161 и указал, что мы хотим, чтобы она была предварительно обучена, установив pretrained = True.
Затем мы хотим убедиться, что мы не обучаем эту модель, поскольку она уже обучена, и мы хотим обучить только классификатор, который мы добавим в следующий раз. Мы говорим модели не вычислять градиенты какого-либо параметра, поскольку это делается только для обучения.
# Получить предварительно обученную модель, используя torchvision.models в качестве библиотеки моделейmodel = models.densenet161 (pretrained = True) # Отключить обучение их параметров для param в model.parameters ():
param.requires_grad = False
Теперь мы хотим заменить классификатор модели по умолчанию с нашим собственным классификатором. Классификаторы - это полностью связанные нейронные сети, поэтому для этого мы должны сначала построить нашу собственную нейронную сеть.
Нейронная сеть - это просто метод поиска сложных шаблонов и связей между числами входа и выхода.В этом случае для определения вероятности того, что изображение является определенной меткой, используются особенности изображения, которые были выделены секцией свертки.
Первое, что мы хотим сделать, это определить количество чисел, вводимых в нашу нейронную сеть. Это должно соответствовать количеству чисел, которое выводится из предыдущего раздела (сверточного раздела). Поскольку мы вообще не меняли сверточную секцию, количество чисел, вводимых в наш классификатор, должно быть таким же, как в классификаторе модели по умолчанию.
Далее мы хотим определить количество выходов. Это число должно соответствовать тому, сколько типов изображений у вас есть. Модель предоставит вам список процентов, каждое из которых соответствует тому, насколько изображение соответствует этой метке. Итак, если у вас есть изображения пчел, муравьев и мух, есть 3 метки. и в выходном слое должно быть 3 числа, каждое из которых соответствует вероятности того, что на входе пчела, муравей или муха.
Получив эти данные, мы используем библиотеку torch.nn для создания классификатора.Информацию можно найти здесь.
- nn. Последовательный может помочь нам сгруппировать несколько модулей вместе.
- nn.Linear определяет взаимодействие между двумя слоями. Мы даем ему 2 числа, определяя количество узлов в двух слоях.
- Например, в первом nn.Linear первый слой является входным, и мы можем выбрать, сколько чисел мы хотим во втором слое (я выбрал 1024).
- nn.ReLU - функция активации для скрытых слоев.Функции активации помогают модели изучить сложные отношения между входом и выходом. Мы используем ReLU на всех слоях, кроме вывода.
Мы повторяем это для сколь угодно большого количества скрытых слоев с любым количеством узлов в каждом слое.
- nn.LogSoftmax - функция активации для выхода. Функция softmax превращает выведенные числа в проценты для каждой метки, а функция журнала применяется для ускорения вычислений.Мы должны указать, что выходной слой является столбцом, поэтому мы устанавливаем размер равным 1.
После создания нашего собственного классификатора мы заменяем классификатор модели по умолчанию.
# Создать новый классификатор для модели, используя torch.nn как nn libraryclassifier_input = model.classifier.in_features
num_labels = # ВВЕДИТЕ КОЛИЧЕСТВО ЭТИКЕТК В ВАШИХ ДАННЫХclassifier = nn.Sequential (nn.Linear (classifier_input, 1024),
nn .ReLU (),
nn.Linear (1024, 512),
nn.ReLU (),
nn.Linear (512, num_labels),
nn.LogSoftmax (dim = 1)) # Заменить классификатор по умолчанию новым classifiermodel.classifier = classifier
Теперь модель создана! Далее нам просто нужно его потренировать.
Обучение модели на графическом процессоре происходит намного быстрее, чем на центральном процессоре. Поэтому, чтобы определить, какое устройство доступно для вас, мы используем Torch для проверки. Если есть совместимый графический процессор, мы устанавливаем переменную на графический процессор, если нет, он привязан к процессору. Затем мы перемещаем нашу модель на это устройство.
# Найдите устройство, доступное для использования, используя torch librarydevice = torch.device ("cuda" if torch.cuda.is_available () else "cpu") # Переместить модель на устройство, указанное вышеmodel.to (device)
Во время обучения нам нужно определить, насколько наша модель «выключена». Чтобы оценить количество ошибок в нашей модели, мы используем nn.NLLLoss . Эта функция принимает выходные данные нашей модели, для которой мы использовали функцию nn.LogSoftmax.
Чтобы обучить нашу модель, мы берем нашу ошибку и смотрим, как мы можем скорректировать веса, на которые мы умножили наши числа, чтобы получить наименьшую ошибку.Метод расчета того, как мы корректируем наши веса и применяем его к нашим весам, называется Адам. Мы используем библиотеку torch.optim, чтобы использовать этот метод и передать ему наши параметры.
# Задайте функцию ошибки, используя torch.nn как nn librarycriterion = nn.NLLLoss () # Задайте функцию оптимизатора, используя torch.optim как optim libraryoptimizer = optim.Adam (model.classifier.parameters ())
Теперь мы обучаем . Мы хотим, чтобы наша модель проходила через весь набор данных несколько раз, поэтому мы используем цикл for. Каждый раз, когда он просматривает весь набор изображений, это называется эпохой.В одну эпоху мы хотим, чтобы модель прошла как обучающий набор, так и набор проверки.
Начнем с обучающего набора.
Сначала мы устанавливаем модель в режим обучения и используем цикл for для просмотра каждого изображения.
После перемещения изображений и меток на соответствующее устройство нам нужно очистить настройки весов, объявив optimizer.zero_grad () .
Затем мы можем вычислить выход нашей модели с учетом наших изображений и того, насколько «выключена» наша модель с ее выходными данными и правильными ответами.
Затем мы можем найти корректировки, которые нам необходимо внести, чтобы уменьшить эту ошибку, вызвав loss.backward () , и использовать наш оптимизатор для корректировки весов, вызвав optimizer.step () .
Во время обучения мы хотим знать, как идут дела, поэтому мы отслеживаем общие ошибки, которые мы рассчитали, и распечатываем ход обучения.
Переходим к валидационному набору.
Мы установили нашу модель в режим оценки и используем цикл for для перебора всех изображений в нашем наборе.
Мы повторяем шаги, которые мы предприняли для обучающего набора, чтобы получить выходные данные нашей модели и насколько наша модель «отстает» от реальных меток.
Наша модель использовала функцию LogSoftmax для увеличения скорости вычислений, но теперь нам нужны реальные проценты, а не проценты журнала. Поэтому мы используем torch.exp , чтобы обратить функцию журнала. Затем мы хотим увидеть, какой класс модель отнесла к нашим изображениям. .topk дает нам высший класс, который был угадан, и какой процент он угадал - нам важен только класс, поэтому мы можем игнорировать процент.
Чтобы определить, сколько изображений было угадано правильно, мы проверяем, какие угаданные классы равны реальным классам. Затем мы можем усреднить весь пакет, чтобы определить точность нашей модели (сколько изображений было угадано правильно, деленное на общее количество изображений).
После прохождения набора для обучения и проверки мы хотим распечатать ошибки для обоих и точность набора проверки.
эпох = 10
для эпох в диапазоне (эпох):
train_loss = 0
val_loss = 0
precision = 0# Обучение модели
# Очистить оптимизаторы
model.train ()
counter = 0
для входов, метки в train_loader:
# Перейти к устройству
inputs, labels = inputs.to (устройство), labels.to (устройство)
optimizer.zero_grad () # Вперед pass
output = model.forward (input) # Loss
loss = criterion (output, labels) # Рассчитать градиенты (backpropogation)
loss.backward () # Настроить параметры на основе градиентов
optimizer.step () # Добавить потерю к rnning loss обучающего набора
train_loss + = loss.item () * inputs.size (0)# Распечатать прогресс нашего обучения
counter + = 1
print (counter, "/", len (train_loader))# Оценка модели
# Прямой проход
model.eval ()
counter = 0
# Сказать горелке, что градиенты
не рассчитывать с помощью torch.no_grad ():
для входов, метки в val_loader:
# Переместить на вход устройства
, метки = inputs.to (устройство), labels.to (устройство)
output = model.forward (inputs) # Вычислить потери
valloss = критерий (output, labels) # Добавить потерю к текущим потерям валидационного набора
val_loss + = valloss.item () * inputs.size (0)# Поскольку наша модель выводит LogSoftmax, найдите реальные
# Получите высший класс вывода
# проценты, изменив логарифмическую функцию
output = torch.exp (output)
top_p , top_class = output.topk (1, dim = 1) # Посмотрите, сколько классов было правильным?
equals = top_class == labels.view (* top_class.shape) # Вычислить среднее значение (получить точность для этой партии)
# и прибавить его к точности хода для этой эпохи
precision + = torch.mean (equals.type (torch.FloatTensor)). item ()# Распечатать прогресс нашей оценки
counter + = 1
print (counter, "/", len (val_loader))# Получить среднюю потерю для вся эпоха
# Распечатайте информацию
train_loss = train_loss / len (train_loader.dataset)
valid_loss = val_loss / len (val_loader.dataset)
print ('Accuracy:', precision / len (val_loader))
print (' Эпоха: {} \ tПотеря обучения: {: .6f} \ tПотеря проверки: {: .6f} '. Format (epoch, train_loss, valid_loss))
Это было здорово! Вы только что создали классификатор изображений AI.Но теперь мы действительно хотим использовать его - мы хотим дать ему случайное изображение и посмотреть, какой ярлык он считает своим.
Сначала мы устанавливаем модель в оценочный режим.
model.eval ()
Затем мы создаем функцию, которая может обрабатывать изображение, чтобы его можно было ввести в нашу модель.
Мы открываем изображение, изменяем его размер, сохраняя соотношение сторон, но сделав самую короткую сторону только 255 пикселей, и обрезаем центр 224 на 224 пикселей. Затем мы превращаем изображение в массив и убеждаемся, что количество цветовых каналов является первым измерением, а не последним, путем транспонирования массива.Затем мы преобразуем каждое значение между 0 и 1 путем деления на 255. Затем мы нормализуем значения путем вычитания среднего и деления на стандартное отклонение. Наконец, мы конвертируем массив в тензор Torch и преобразуем значения в float.
Эти шаги аналогичны шагам, которые мы указали на шаге 2, но на этот раз мы должны вручную кодировать команды, а не полагаться на библиотеку преобразований.
# Обработать наше изображение
def process_image (image_path):
# Загрузить изображение
img = Image.open (image_path)# Получить размеры изображения
width, height = img.size# Измените размер, сохранив соотношение сторон, но изменив размер
# так, чтобы самый короткий размер был 255px
img = img.resize (( 255, int (255 * (высота / ширина))) if width# Получить размеры нового изображения size
width, height = img .size# Задайте координаты для кадрирования по центру 224 x 224
слева = (ширина - 224) / 2
сверху = (высота - 224) / 2
справа = (ширина + 224) / 2
снизу = (рост + 224) / 2
img = img.Crop ((слева, вверху, справа, внизу))# Превратить изображение в массив numpy
img = np.array (img)# Сделать измерение цветового канала первым вместо последнего
img = img.transpose ((2 , 0, 1))# Сделать все значения от 0 до 1
img = img / 255# Нормализовать на основе предварительно установленного среднего и стандартного отклонения
img [0] = (img [0] - 0,485) /0,229
img [1] = (img [1] - 0,456) /0,224
img [2] = (img [2] - 0,406) /0,225# Добавьте четвертое измерение в начало, чтобы указать размер пакета
img = img [нп.newaxis ,:]# Превратить в тензор факела
image = torch.from_numpy (img)
image = image.float ()
return image
После обработки изображения мы можем построить функцию, которая будет использовать нашу модель для предсказать этикетку. Мы вводим изображение в нашу модель и получаем результат. Затем мы переворачиваем журнал в функции LogSoftmax, которую мы применили в выходном слое, и возвращаем верхний класс, предсказанный моделью, и степень уверенности в своем предположении.
# Использование нашей модели для прогнозирования метки
def pred (image, model):
# Передача изображения через нашу модель
output = model.forward (image)# Обратить функцию журнала в нашем выводе
output = torch.exp (output)# Получить верхний прогнозируемый класс и процент вывода для
# этот класс
probs, classes = output.topk (1 , dim = 1)
return probs.item (), classes.item ()
Наконец, мы хотим отобразить изображение. Мы превращаем изображение обратно в массив и ненормализуем его, умножая на стандартное отклонение и добавляя среднее значение. Затем мы используем библиотеку matplotlib.pyplot для построения изображения.
# Показать изображение
def show_image (image):
# Преобразовать изображение в numpy
image = image.numpy ()# Отменить нормализацию изображения
image [0] = image [0] * 0,226 + 0,445# Распечатайте изображение
fig = plt.figure (figsize = (25, 4))
plt.imshow (np.transpose (image [0], (1, 2, 0)))
Теперь мы можем использовать все эти функции, чтобы напечатать предположение нашей модели и насколько оно было достоверным!
# Образ процесса
image = process_image ("root / image1234.jpg") # Предоставить изображение модели для прогнозирования вывода
top_prob, top_class = pred (image, model) # Показать изображение
show_image (image) # Распечатать результаты
print ("Модель есть", top_prob * 100, "% уверенности в том, что изображение имеет предсказанный класс", top_class)
Вот и все!
compose-spec / spec.md на главном сервере · compose-spec / compose-spec · GitHub
{: .no_toc}
Статус этого документа
Этот документ определяет формат файла Compose, используемый для определения приложений с несколькими контейнерами. Распространение данного документа не ограничено.
Ключевые слова «ДОЛЖЕН», «НЕ ДОЛЖЕН», «ОБЯЗАТЕЛЬНО», «ДОЛЖЕН», «НЕ ДОЛЖЕН», «ДОЛЖЕН», «НЕ ДОЛЖЕН», «РЕКОМЕНДУЕТСЯ», «МОЖЕТ» и «ДОПОЛНИТЕЛЬНО» должны интерпретироваться, как описано в RFC 2119.
Требования и дополнительные атрибуты
Спецификация Compose включает свойства, предназначенные для локальной среды выполнения контейнера OCI, раскрывая параметры конфигурации ядра Linux, а также некоторые свойства контейнера Windows, а также функции облачной платформы, связанные с размещением ресурсов в кластере, распространением реплицированных приложений и масштабируемостью.
Мы подтверждаем, что никакая реализация Compose не будет поддерживать все атрибуты , и что поддержка некоторых свойств зависит от платформы и может быть подтверждено только во время выполнения. Определение версионной схемы для управления поддерживаемыми свойства в файле Compose, установленном инструментом создания докеров, где компонент Compose формат файла был разработан, не дает никаких гарантий того, что атрибуты конечного пользователя будут фактически реализованы.
Спецификация определяет ожидаемый синтаксис конфигурации и поведение, но - пока не указано иное - поддержка любого из них НЕОБЯЗАТЕЛЬНА.
Реализация Compose для анализа файла Compose с использованием неподдерживаемых атрибутов ДОЛЖНА предупреждать пользователя. Мы рекомендуем разработчиков для поддержки этих режимов работы:
- по умолчанию: предупреждать пользователя о неподдерживаемых атрибутах, но игнорировать их
- strict: предупредить пользователя о неподдерживаемых атрибутах и отклонить файл набора
- свободно: игнорировать неподдерживаемые атрибуты И неизвестные атрибуты (которые не были определены в спецификации на момент создания реализации)
Модель приложения Compose
Спецификация Compose позволяет определить платформенно-независимое контейнерное приложение.Такое приложение разработано как набор контейнеров, которые должны работать вместе с соответствующими общими ресурсами и каналами связи.
Вычислительные компоненты приложения определяются как службы. Служба - это абстрактная концепция, реализованная на платформах путем запуска одного и того же образа контейнера (и конфигурации) один или несколько раз.
Службывзаимодействуют друг с другом через сети. В этой спецификации сеть - это абстракция возможностей платформы для установления IP-маршрута между контейнерами внутри служб, соединенных вместе.Параметры низкоуровневой сети, зависящие от платформы, сгруппированы в определение сети и МОГУТ быть частично реализованы на некоторых платформах.
Службыхранят и передают постоянные данные в тома. Спецификация описывает такие постоянные данные как монтирование файловой системы высокого уровня с глобальными параметрами. Фактические детали реализации, зависящие от платформы, сгруппированы в определение томов и МОГУТ быть частично реализованы на некоторых платформах.
Для некоторых служб требуются данные конфигурации, зависящие от среды выполнения или платформы.Для этого в спецификации определена специальная концепция: Configs. С точки зрения контейнера службы конфигурации сопоставимы с томами в том смысле, что они представляют собой файлы, смонтированные в контейнере. Но фактическое определение включает в себя отдельные ресурсы и службы платформы, которые абстрагируются этим типом.
Секрет - это особая разновидность данных конфигурации для конфиденциальных данных, которую НЕ СЛЕДУЕТ раскрывать без соображений безопасности. Секреты предоставляются службам в виде файлов, смонтированных в их контейнерах, но ресурсы конкретной платформы для предоставления конфиденциальных данных достаточно специфичны, чтобы заслужить отдельную концепцию и определение в спецификации Compose.
Различие в объемах, конфигурациях и секретах позволяет реализациям предлагать сопоставимую абстракцию на уровне обслуживания, но при этом охватывать конкретную конфигурацию адекватных ресурсов платформы для четко идентифицированного использования данных.
A Project - это индивидуальное развертывание спецификации приложения на платформе. Название проекта используется для группировки
ресурсы вместе и изолировать их от других приложений или другой установки одного и того же приложения. Составьте указанное приложение с различными параметрами.Реализация Compose, создающая ресурсы на платформе, ДОЛЖНА быть префиксом имен ресурсов по проекту и
установите метку com.docker.compose.project
.
Иллюстративный пример
Следующий пример иллюстрирует концепцию спецификации Compose на конкретном примере приложения. Пример ненормативный.
Рассмотрим приложение, разделенное на интерфейсное веб-приложение и внутреннюю службу.
Внешний интерфейс настраивается во время выполнения с помощью файла конфигурации HTTP, управляемого инфраструктурой, с предоставлением имени внешнего домена и сертификата сервера HTTPS, введенного защищенным хранилищем секретов платформы.
Серверная часть хранит данные в постоянном томе.
Обе службы взаимодействуют друг с другом в изолированной сети внутреннего уровня, в то время как интерфейс также подключен к сети переднего уровня и предоставляет порт 443 для внешнего использования.
(Внешний пользователь) -> 443 [внешняя сеть]
|
+ -------------------- +
| интерфейсная служба | ... ro ...
| "webapp" |...ro ... <сертификат сервера> #secured
+ -------------------- +
|
[серверная сеть]
|
+ -------------------- +
| серверная служба | г + ш ___________________
| "база данных" | ======= (постоянный том)
+ -------------------- + \ _________________ /
Пример приложения состоит из следующих частей:
- 2 сервиса, поддерживаемые образами Docker:
webapp
ибаза данных
- 1 секрет (сертификат HTTPS), внедренный во внешний интерфейс Конфигурация
- 1 (HTTP), введенная во внешний интерфейс
- 1 постоянный том, прикрепленный к бэкэнду
- 2 сети
услуги: внешний интерфейс: изображение: здорово / webapp порты: - «443: 8043» сети: - передний ярус - задний ярус конфиги: - httpd-config секреты: - сервер-сертификат бэкэнд: изображение: здорово / база данных объемы: - db-данные: / etc / data сети: - задний ярус объемы: db-данные: драйвер: flocker driver_opts: размер: «10 ГБ» конфиги: httpd-config: внешний: правда секреты: сервер-сертификат: внешний: правда сети: # Наличие этих объектов достаточно для их определения передний уровень: {} задний ярус: {}
Этот пример иллюстрирует различие между томами, конфигурациями и секретами.Пока все они разоблачены
для обслуживания контейнеров как смонтированных файлов или каталогов только том можно настроить для доступа для чтения и записи.
Секреты и конфиги доступны только для чтения. Конфигурация тома позволяет вам выбрать драйвер тома и передать параметры драйвера.
для настройки управления томами в соответствии с реальной инфраструктурой. Конфиги и секреты полагаются на сервисы платформы,
и объявлены внешними
, поскольку они не управляются как часть жизненного цикла приложения: реализация Compose
будет использовать механизм поиска, зависящий от платформы, для получения значений времени выполнения.
Составить файл
Файл Compose - это файл YAML, определяющий
версия (УСТАРЕВШАЯ),
услуги (ОБЯЗАТЕЛЬНО),
сети,
объемы,
конфиги и
секреты.
Путь по умолчанию для файла Compose - compose.yaml
(предпочтительно) или compose.yml
в рабочем каталоге.
Реализации Compose ДОЛЖНЫ также поддерживать docker-compose.yaml
и docker-compose.yml
для обратной совместимости.
Если существуют оба файла, реализации Compose ДОЛЖНЫ предпочесть каноническую компоновку .yaml
один.
Файлы Multiple Compose можно объединить вместе для определения модели приложения. Комбинация файлов YAML ДОЛЖЕН быть реализован путем добавления / переопределения элементов YAML на основе порядка файлов Compose, установленного пользователем. Простой Атрибуты и карты заменяются файлом Compose самого высокого порядка, списки объединяются путем добавления. Родственник пути ДОЛЖНЫ быть разрешены на основе первого Compose файла родительской папки, всякий раз, когда дополнительные файлы объединенные размещаются в других папках.
Поскольку некоторые элементы файла Compose могут быть выражены как отдельные строки или сложные объекты, слияние ДОЛЖНО применяться к развернутая форма.
Профили
Профилипозволяют настроить модель приложения Compose для различных целей и сред. Составить реализация ДОЛЖНА позволять пользователю определять набор активных профилей. Точный механизм - это реализация специфичен и МОЖЕТ включать флаги командной строки, переменные среды и т.д.
Элемент верхнего уровня Services поддерживает атрибут profiles
для определения списка именованных профилей.Услуги без
набор атрибутов профилей ДОЛЖЕН быть включен всегда. Сервис ДОЛЖЕН игнорироваться Compose
реализация, когда ни один из перечисленных профилей
не соответствует активным, если услуга не
явно нацеленный командой. В этом случае его профиль
ДОЛЖЕН быть добавлен к набору активных профилей.
На все остальные элементы верхнего уровня не влияет профиль
, и они всегда активны.
Ссылки на другие службы ( ссылки
, расширяют
или синтаксис общих ресурсов service: xxx
) НЕ ДОЛЖНЫ
автоматически включить компонент, который в противном случае был бы проигнорирован активными профилями.Вместо этого
Реализация Compose ДОЛЖНА возвращать ошибку.
Иллюстративный пример
услуг: foo: изображение: foo бар: изображение: бар профили: - контрольная работа баз: изображение: baz зависит от: - бар профили: - контрольная работа zot: изображение: zot зависит от: - бар профили: - отладка
- Модель приложения Compose, проанализированная без включенного профиля, содержит только службу
foo
. - Если включен профиль
test
, модель содержит службыbar
иbaz
, которые включенытестовый профиль
и сервисfoo
, который всегда включен. - Если включен профиль
debug
, модель содержит службыfoo
иzot
, но неbar
иbaz
и, как таковая, модель недействительна в отношении ограниченияdepends_on
zot
. - Если включены профили
debug
иtest
, модель содержит все службы:foo
,bar
,baz
иzot
. - Если реализация Compose выполняется с
bar
в качестве явной службы для запуска, она и профильtest
будет активен, даже еслитестовый профиль
не включен пользователем . - Если реализация Compose выполняется с
baz
в качестве явной службы для запуска, службаbaz
и профиль, тест
будет активен, и стерженьзависимо от
. - Если реализация Compose выполняется с
zot
в качестве явной службы для запуска, модель снова будет недействителен в отношении ограниченияdepends_on
zot
, посколькуzot
иbar
не имеют общих профилей - Если реализация Compose выполняется с
zot
в качестве явной службы для запуска и включен профильtest
, профильотладка
автоматически включается, и службаbar
втягивается как зависимость, начиная с обоих услугиzot
иbar
.
Версия элемента верхнего уровня
Свойство верхнего уровня версии
определено спецификацией для обратной совместимости, но является только информативным.
Реализации Compose НЕ СЛЕДУЕТ использовать эту версию для выбора точной схемы для проверки файла Compose, но предпочитаю самую последнюю схему на момент ее разработки.
РеализацииCompose ДОЛЖНЫ подтверждать, что они могут полностью анализировать файл Compose. Если какие-то поля неизвестны, обычно поскольку файл Compose был написан с полями, определенными более новой версией спецификации, реализации Compose СЛЕДУЕТ предупредить пользователя. Реализации Compose МОГУТ предлагать опции для игнорирования неизвестных полей (как определено «свободным» режимом).
Элемент верхнего уровня услуг
Служба — это абстрактное определение вычислительного ресурса в приложении, который можно масштабировать / заменять. независимо от других компонентов. Сервисы поддерживаются набором контейнеров, управляемых платформой. в соответствии с требованиями репликации и ограничениями размещения. Опираясь на контейнеры, Сервисы определены с помощью образа Docker и набора аргументов времени выполнения. Все контейнеры в сервисе идентично создаются с этими аргументы.
Файл Compose ДОЛЖЕН объявлять корневой элемент services
как карту, ключи которой являются строковыми представлениями имен служб,
и чьи значения являются определениями услуг. Определение службы содержит конфигурацию, которая применяется к каждому
контейнер запущен для этой службы.
Каждая служба МОЖЕТ также включать раздел Build, который определяет, как создать образ Docker для службы. Реализации Compose МОГУТ поддерживать создание образов докеров с использованием этого определения службы.Если не реализовано раздел Build СЛЕДУЕТ игнорировать, а файл Compose ДОЛЖЕН считаться действительным.
Поддержка сборкиявляется ДОПОЛНИТЕЛЬНЫМ аспектом спецификации Compose и подробно описывается здесь.
Каждая служба определяет ограничения времени выполнения и требования для запуска своих контейнеров. В развернуты группы секций
эти ограничения и позволяет платформе настраивать стратегию развертывания, чтобы наилучшим образом соответствовать потребностям контейнеров с
доступные ресурсы.
Deploy является ДОПОЛНИТЕЛЬНЫМ аспектом спецификации Compose и подробно описывается здесь.Если не реализовано, раздел Deploy СЛЕДУЕТ игнорировать, а файл Compose ДОЛЖЕН считаться действительным.
развернуть
развертывание
определяет конфигурацию для развертывания и жизненного цикла услуг, как определено здесь.
blkio_config
blkio_config
определяет набор параметров конфигурации для установки ограничений блочного ввода-вывода для этой службы.
услуг: foo: изображение: busybox blkio_config: вес: 300 weight_device: - путь: / dev / sda вес: 400 device_read_bps: - путь: / dev / sdb скорость: '12 МБ' device_read_iops: - путь: / dev / sdb рейтинг: 120 device_write_bps: - путь: / dev / sdb рейтинг: '1024k' device_write_iops: - путь: / dev / sdb рейтинг: 30
device_read_bps, device_write_bps
Установить ограничение в байтах в секунду для операций чтения / записи на данном устройстве.Каждый элемент в списке ДОЛЖЕН иметь два ключа:
-
путь
: определение символьного пути к затронутому устройству. -
скорость
: либо как целочисленное значение, представляющее количество байтов, либо как строка, выражающая значение байта.
device_read_iops, device_write_iops
Установить ограничение на количество операций в секунду для операций чтения / записи на данном устройстве. Каждый элемент в списке ДОЛЖЕН иметь два ключа:
-
путь
: определение символьного пути к затронутому устройству. -
скорость
: как целое число, представляющее разрешенное количество операций в секунду.
вес
Измените долю полосы пропускания, выделенной этой службе, по сравнению с другими службами. Принимает целое число от 10 до 1000, по умолчанию 500.
weight_device
Точная настройка распределения полосы пропускания по устройству. У каждого элемента в списке должно быть два ключа:
-
путь
: определение символьного пути к затронутому устройству. -
вес
: целое число от 10 до 1000.
cpu_count
cpu_count
определяет количество используемых ЦП для сервисного контейнера.
cpu_percent
cpu_percent
определяет полезный процент доступных процессоров.
cpu_shares
определяет (как целое число) относительный вес ЦП сервис-контейнера по сравнению с другими контейнерами.
cpu_period
cpu_period
разрешить реализациям Compose для настройки периода CFS (полностью справедливого планировщика) ЦП, когда платформа базируется
на ядре Linux.
cpu_quota
cpu_quota
разрешить реализациям Compose для настройки квоты CPU CFS (Completely Fair Scheduler), когда платформа основана
на ядре Linux.
cpu_rt_runtime
cpu_rt_runtime
настраивает параметры распределения ЦП для платформы с поддержкой планировщика в реальном времени. Может быть
целочисленное значение с использованием микросекунд в качестве единицы или продолжительности.
cpu_rt_runtime: '400 мс' cpu_rt_runtime: 95000`
cpu_rt_period
cpu_rt_period
настраивает параметры распределения ЦП для платформы с поддержкой планировщика в реальном времени.Может быть
целочисленное значение с использованием микросекунд в качестве единицы или продолжительности.
cpu_rt_period: '1400us' cpu_rt_period: 11000`
процессор
УСТАРЕЛО: используйте deploy.reservations.cpus
cpus
определяет количество (потенциально виртуальных) процессоров, выделяемых для сервисных контейнеров. Это дробное число. 0,000
означает отсутствие ограничений.
процессор
cpuset
явно определяет процессоры, в которых разрешено выполнение.Может быть диапазоном 0-3
или списком 0,1
сборка
build
определяет конфигурацию сборки для создания образа контейнера из источника, как определено здесь.
cap_add
cap_add
определяет дополнительные возможности контейнера
как струны.
cap_drop
cap_drop
указывает возможности контейнера для удаления
как струны.
cap_drop:
- NET_ADMIN
- SYS_ADMIN
cgroup_parent
cgroup_parent
указывает ДОПОЛНИТЕЛЬНУЮ родительскую контрольную группу для контейнера.
cgroup_parent: м-исполнитель-abcd
команда
Команда
переопределяет команду по умолчанию, объявленную в образе контейнера (то есть в Dockerfile’s CMD
).
команда: bundle exec thin -p 3000
Команда также может быть списком, аналогично Dockerfile:
команда: ["bundle", "exec", "thin", "-p", "3000"]
конфигов
Конфигурации
предоставляют доступ к конфигурациям для каждой службы с использованием конфигураций для каждой службы
конфигурация.Поддерживаются два разных варианта синтаксиса.
Compose ДОЛЖНЫ сообщать об ошибке, если конфигурация не существует на платформе или не определена в конфиг
раздела этого файла Compose.
Для конфигов определены два синтаксиса. Чтобы соответствовать этой спецификации, реализация ДОЛЖЕН поддерживать оба синтаксиса. Реализации ДОЛЖНЫ допускать использование как короткого, так и длинного синтаксиса в одном документе.
Краткий синтаксис
В варианте с коротким синтаксисом указывается только имя конфигурации.Это дает
доступ контейнера к конфигурации и монтирует его по адресу /
внутри контейнера. Устанавливаются как имя источника, так и конечная точка монтирования.
к имени конфигурации.
В следующем примере используется короткий синтаксис для предоставления службы redis
.
доступ к конфигам my_config
и my_other_config
. Значение my_config
устанавливается в содержимое файла ./my_config.txt
, и my_other_config
определяется как внешний ресурс, что означает, что он имеет
уже определено в платформе.Если внешний конфиг не существует,
развертывание ДОЛЖНО завершиться неудачей.
услуг: Redis: изображение: redis: последний конфиги: - my_config конфиги: my_config: файл: ./my_config.txt my_other_config: внешний: истинный
Длинный синтаксис
Длинный синтаксис обеспечивает большую детализацию создания конфигурации в контейнерах задач службы.
-
источник
: имя конфигурации в том виде, в котором она существует на платформе. -
цель
: путь и имя файла, который будет смонтирован в сервисе контейнеры задач.По умолчанию/ <источник>
, если не указано. -
uid
иgid
: числовой UID или GID, которому принадлежит смонтированный файл конфигурации. в контейнерах задач службы. Значение по умолчанию, если не указано, — это запущенный контейнер USER. -
режим
: разрешения для файла, смонтированного внутри службы контейнеры задач в восьмеричной системе счисления. Значение по умолчанию доступно для чтения всем (0444
). Записываемый бит ДОЛЖЕН игнорироваться. Исполняемый бит может быть установлен.
В следующем примере задается имя my_config
как redis_config
в пределах
контейнер, устанавливает режим 0440
(групповое чтение) и устанавливает пользователя и группу
на номер 103
. Служба redis
не имеет доступа к my_other_config
config.
услуг: Redis: изображение: redis: последний конфиги: - источник: my_config цель: / redis_config uid: "103" gid: "103" режим: 0440 конфиги: my_config: внешний: правда my_other_config: внешний: истинный
Вы можете предоставить сервису доступ к нескольким конфигурациям, и вы можете смешивать длинный и короткий синтаксис.
имя_контейнера
имя_контейнера
— это строка, определяющая пользовательское имя контейнера, а не сгенерированное имя по умолчанию.
имя_контейнера: my-web-container
Реализация Compose НЕ ДОЛЖНА масштабировать службу за пределы одного контейнера, если файл Compose указывает имя_контейнера
. Попытка сделать это ДОЛЖНА привести к ошибке.
Если присутствует, имя_контейнера
ДОЛЖНО следовать формату регулярного выражения [a-zA-Z0-9] [a-zA-Z0-9_.-] +
credential_spec
credential_spec
настраивает спецификацию учетных данных для управляемой учетной записи службы.
Compose, которые поддерживают службы, использующие контейнеры Windows, ДОЛЖНЫ поддерживать файл :
и
Реестр : протоколы
для credential_spec. Реализации Compose МОГУТ также поддерживать дополнительные
протоколы для индивидуальных сценариев использования.
credential_spec
должен иметь формат file: //
or registry: //
.
credential_spec: файл: my-credential-spec.json
При использовании реестра :
спецификация учетных данных считывается из реестра Windows на
хост демона. Параметр реестра с указанным именем должен находиться в:
HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Virtualization \ Containers \ CredentialSpecs
В следующем примере загружается спецификация учетных данных из значения с именем my-credential-spec
.
в реестре:
credential_spec: реестр: my-credential-spec
Пример конфигурации gMSA
При настройке спецификации учетных данных gMSA для службы вам нужно только
чтобы указать спецификацию учетных данных с config
, как показано в следующем примере:
услуг: myservice: изображение: myimage: последний credential_spec: конфигурация: my_credential_spec конфиги: my_credentials_spec: файл: ./my-credential-spec.json |
зависит от
depends_on
выражает зависимости запуска и завершения работы между службами.
Краткий синтаксис
В сокращенном варианте синтаксиса указываются только служебные имена зависимостей. Зависимости служб вызывают следующее поведение:
- Реализации
Compose ДОЛЖНЫ создавать службы в порядке зависимости. В следующих Например,
db
иredis
создаются доweb
. - Реализации
Compose ДОЛЖНЫ удалять службы в порядке зависимости. В следующих Например,
web
удаляется доdb
иredis
.
Простой пример:
услуг: Интернет: строить: . зависит от: - дб - Redis Redis: изображение: redis db: изображение: postgresРеализации
Compose ДОЛЖНЫ гарантировать, что службы зависимостей были запущены раньше. запуск зависимой службы.Реализации Compose МОГУТ ждать, пока службы зависимостей будут «готовы», прежде чем запуск зависимой службы.
Длинный синтаксис
Синтаксис полной формы позволяет настраивать дополнительные поля, которые не могут быть выражается в краткой форме.
-
условие
: условие, при котором зависимость считается выполненной-
service_started
: эквивалент короткого синтаксиса, описанного выше -
service_healthy
: указывает, что зависимость должна быть «работоспособной» (как показывает проверка работоспособности) перед запуском иждивенца служба. -
service_completed_successfully
: указывает, что ожидается запуск зависимости до успешного завершения перед запуском зависимой службы.
-
Зависимости служб вызывают следующее поведение:
- Реализации
Compose ДОЛЖНЫ создавать службы в порядке зависимости. В следующих Например,
db
иredis
создаются доweb
. - Реализации
Compose ДОЛЖНЫ дождаться проверки работоспособности для передачи зависимостей. с пометкой
service_healthy
.В следующем примере ожидается, чтоdb
быть «здоровым» до созданияweb
. - Реализации
Compose ДОЛЖНЫ удалять службы в порядке зависимости. В следующих Например,
web
удаляется доdb
иredis
.
Простой пример:
услуг: Интернет: строить: . зависит от: db: condition: service_healthy Redis: условие: service_started Redis: изображение: redis db: изображение: postgresРеализации
Compose ДОЛЖНЫ гарантировать, что службы зависимостей были запущены раньше.
запуск зависимой службы.Реализации Compose ДОЛЖНЫ гарантировать службы зависимостей, отмеченные service_healthy
являются «работоспособными» перед запуском зависимой службы.
device_cgroup_rules
device_cgroup_rules
определяет список правил контрольной группы устройств для этого контейнера.
Формат — тот же формат, который ядро Linux указывает в группах управления.
Контроллер белого списка устройств.
device_cgroup_rules: - 'c 1: 3 mr' - 'а 7: * rmw'
устройств
устройства
определяет список сопоставлений устройств для созданных контейнеров.
устройств: - «/ dev / ttyUSB0: / dev / ttyUSB0»
DNS
dns
определяет настраиваемые DNS-серверы для настройки в конфигурации сетевого интерфейса контейнера. Может быть одиночным значением или списком.
dns_opt
dns_opt
перечисляет настраиваемые параметры DNS, которые необходимо передать преобразователю DNS контейнера (файл /etc/resolv.conf
в Linux).
dns_opt: - использование-vc - no-tld-query
dns_search
dns
определяет пользовательские домены поиска DNS для настройки в конфигурации сетевого интерфейса контейнера.Может быть одиночным значением или списком.
dns_search: - dc1.example.com - dc2.example.com
доменное имя
имя домена
объявляет пользовательское доменное имя, которое будет использоваться для контейнера службы. ДОЛЖНО быть допустимым именем хоста RFC 1123.
точка входа
точка входа
переопределяет точку входа по умолчанию для образа Docker (т. Е. ENTRYPOINT
, установленную Dockerfile).
Реализации Compose ДОЛЖНЫ очищать любую команду по умолчанию в образе Docker — как ENTRYPOINT
, так и CMD
инструкция.
в Dockerfile — когда точка входа
настроена файлом Compose.Если также задана команда
,
он используется в качестве параметра для точки входа
в качестве замены для образа Docker CMD
точка входа: /code/entrypoint.sh
Точка входа также может быть списком аналогично Dockerfile:
точка входа: - php - -d - zend_extension = / usr / local / lib / php / extensions / no-debug-non-zts-20100525 / xdebug.so - -d - memory_limit = -1 - поставщик / bin / phpunit
env_file
env_file
добавляет переменные среды в контейнер в зависимости от содержимого файла.
env_file
также может быть списком. Файлы в списке ДОЛЖНЫ обрабатываться сверху вниз. Для той же переменной
указанные в двух файлах env, ДОЛЖНО оставаться значение из последнего файла в списке.
env_file: - ./a.env - ./b.env
Относительный путь ДОЛЖЕН определяться из родительской папки файла Compose. Поскольку абсолютные пути мешают Compose
file от переносимости, реализации Compose ДОЛЖНЫ предупреждать пользователей, когда такой путь используется для установки env_file
.
Переменные среды, объявленные в разделе среды ДОЛЖНЫ переопределить эти значения — это верно, даже если эти значения пустой или неопределенный.
Формат Env_file
Каждая строка в файле env ДОЛЖНА быть в формате VAR [= [VAL]]
. Строки, начинающиеся с #
, ДОЛЖНЫ игнорироваться.
Пустые строки также ДОЛЖНЫ игнорироваться.
Значение VAL
используется как необработанная строка и вообще не изменяется. Если значение заключено в кавычки
(как это часто бывает с переменными оболочки), кавычки ДОЛЖНЫ быть включены в значение, передаваемое в контейнеры.
созданный реализацией Compose.
VAL
МОЖЕТ быть опущен, в таких случаях значение переменной является пустой строкой. = VAL
МОЖЕТ быть опущен, в таких случаях переменная не установлена .
# Установить рельсы / стойку RACK_ENV = разработка VAR = "цитируется"
окружающая среда
среда
определяет переменные среды, установленные в контейнере. среда
может использовать либо массив, либо
карта. Любые логические значения; истина, ложь, да, нет, ДОЛЖНЫ быть заключены в кавычки, чтобы гарантировать
синтаксический анализатор YAML не преобразует их в True или False.
Переменные среды МОГУТ быть объявлены одним ключом (без значения, равного знаку). В таком случае составьте реализации ДОЛЖНЫ полагаться на некоторое взаимодействие с пользователем для определения значения. В противном случае переменная не задан и будет удален из среды контейнера служб.
Синтаксис карты:
Окружающая среда: RACK_ENV: разработка ШОУ: "правда" USER_INPUT:
Синтаксис массива:
Окружающая среда: - RACK_ENV = разработка - ПОКАЗАТЬ = правда - USER_INPUT
Когда и env_file
, и среда
установлены для службы, значения, установленные средой
, имеют приоритет.
выставить
expose
определяет порты, которые реализации Compose ДОЛЖНЫ открываться из контейнера. Эти порты ДОЛЖНЫ быть
доступны для связанных служб и НЕ ДОЛЖНЫ публиковаться на главном компьютере. Только внутренний контейнер
могут быть указаны порты.
выставить: - «3000» - «8000»
расширяется
Расширить другую службу в текущем или другом файле, при необходимости переопределив конфигурацию. Вы можете использовать расширяет
на любую службу вместе с другими ключами конфигурации.Значение extends
ДОЛЖНО быть отображением
определяется с помощью требуемой службы
и необязательного ключа файла .
расширяет: файл: common.yml сервис: webapp
Если поддерживается реализация Compose, ОБЯЗАТЕЛЬНО процесс расширяет
следующим образом:
-
service
определяет имя службы, на которую ссылаются как базовые, напримерweb
илиdatabase
. -
файл
- это расположение файла конфигурации Compose, определяющего эту службу.
Ограничения
К указанной услуге применяются следующие ограничения:
- Службы, зависящие от других служб, не могут использоваться в качестве основы. Поэтому любой ключ
который вводит зависимость от другой службы, несовместимо с
, расширяет
. В Неисчерпывающий список таких ключей:ссылки
,volume_from
,container
mode (вipc
,pid
,network_mode
иnet
),service
mode (вipc
,pid
иnetwork_mode
),зависит_ от
. - Сервисы не могут иметь циклических ссылок с
extends
Реализации Compose ДОЛЖНЫ возвращать ошибку во всех этих случаях.
Поиск справочной службы
файл
значение может быть:
- Нет. Это указывает на то, что имеется ссылка на другую службу в том же файле Compose.
- Путь к файлу, который может быть одним из следующих:
- Относительный путь. Этот путь считается относительно местоположения основного Compose файл.
- Абсолютный путь.
Служба, обозначенная как служба
ДОЛЖНА присутствовать в идентифицированном файле Compose, на который имеется ссылка.
Реализации Compose ДОЛЖНЫ возвращать ошибку, если:
- Сервис, обозначенный
Сервис
не найден - Составить файл, обозначенный как
файл
не найден
Определения услуг слияния
Два определения службы ( основное, одно в текущем файле Compose и ссылается на одно
указано extends
) ДОЛЖЕН быть объединен следующим образом:
- Сопоставления: ключи в сопоставлениях основного определения службы ключи переопределения в сопоставлениях из ссылается на определение услуги .Ключи, которые не заменяются, включаются как есть.
- Последовательности: элементы объединяются в новую последовательность. Порядок элементов сохранен с ссылками элементов идут первыми и основных элементов после.
- Скаляры: ключи в определении основной службы имеют приоритет над ключами в ссылался на один.
Отображения
Следующие ключи следует рассматривать как сопоставления: build.args
, build.этикетки
, build.extra_hosts
, deploy.labels
, deploy.update_config
, deploy.rollback_config
, deploy.restart_policy
, deploy.resources.limits
, среда
, проверка работоспособности
, метки
, logging.options
, sysctls
, storage_opt
, extra_hosts
, ulimits
.
Одно исключение, которое применяется к проверки работоспособности
, заключается в том, что основное сопоставление не может указывать disable: true
, если , на которое ссылается сопоставление , также не указывает disable: true
.Сочинять
реализации ДОЛЖНЫ возвращать ошибку в этом случае.
Например, ввод ниже:
услуг: общий: изображение: busybox окружающая обстановка: TZ: utc ПОРТ: 80 cli: расширяется: сервис: общий окружающая обстановка: ПОРТ: 8080
Создает следующую конфигурацию для службы cli
. Тот же вывод
создается, если используется синтаксис массива.
: ПОРТ: 8080 TZ: utc изображение: busybox
элементов под blkio_config.device_read_bps
, blkio_config.device_read_iops
, blkio_config.device_write_bps
, blkio_config.device_write_iops
, устройства
и тома
также рассматриваются как сопоставления, где ключ - это целевой путь внутри
контейнер.
Например, ввод ниже:
услуг: общий: изображение: busybox объемы: - общий том: / var / lib / backup / data: rw cli: расширяется: сервис: общий объемы: - cli-volume: / var / lib / backup / data: ro
Создает следующую конфигурацию для службы cli
.Обратите внимание, что смонтированный путь
теперь указывает на новое имя тома и был применен флаг ro
.
изображение: busybox объемы: - cli-volume: / var / lib / backup / data: ro
Если , на которое ссылается определение службы , содержит отображение расширяет
, элементы под ним
просто копируются в новое определение слияния . Затем процесс слияния завершается.
снова выключите, пока не перестанет выдвигаться . Осталось
ключа.
Например, ввод ниже:
услуг: основание: изображение: busybox пользователь: root общий: изображение: busybox расширяется: услуга: база cli: расширяется: сервис: общий
Создает следующую конфигурацию для службы cli
.Здесь cli
services
получает пользовательский ключ
от общей службы
, которая, в свою очередь, получает этот ключ от базы
служба.
изображение: busybox пользователь: root
Последовательности
Следующие ключи следует рассматривать как последовательности: cap_add
, cap_drop
, configs
, deploy.placement.constraints
, deploy.placement.preferences
, deploy.reservations.generic_resources
, device_cgroup_rules
, expose
, external_links
, порты
, секреты
, security_opt
.Любые дубликаты, полученные в результате слияния, удаляются, так что только последовательность
содержит уникальные элементы.
Например, ввод ниже:
услуг: общий: изображение: busybox security_opt: - метка: роль: РОЛЬ cli: расширяется: сервис: общий security_opt: - метка: пользователь: USER
Создает следующую конфигурацию для службы cli
.
изображение: busybox security_opt: - метка: роль: РОЛЬ - метка: пользователь: USER
В случае использования синтаксиса списка следующие ключи также следует рассматривать как последовательности: dns
, dns_search
, env_file
, tmpfs
.В отличие от полей последовательности, упомянутых выше,
дубликаты, полученные в результате слияния, не удаляются.
Скаляры
Любые другие разрешенные ключи в определении службы следует рассматривать как скаляры.
external_links
external_links
связывает служебные контейнеры со службами, управляемыми вне этого приложения Compose. external_links
определяет имя существующей службы для извлечения с использованием механизма поиска платформы.
Можно указать псевдоним в форме СЕРВИС: АЛИАС
.
внешних_ссылок: - Redis - база данных: mysql - база данных: postgresql
extra_hosts
extra_hosts
добавляет сопоставления имен хостов в конфигурацию сетевого интерфейса контейнера ( / etc / hosts
для Linux).
Значения ДОЛЖНЫ устанавливать имя хоста и IP-адрес для дополнительных хостов в виде ИМЯ ХОСТА: IP
.
extra_hosts: - "somehost: 162.242.195.82" - "otherhost: 50.31.209.229"Реализации
Compose ДОЛЖНЫ создавать соответствующую запись с IP-адресом и именем хоста в сети контейнера.
конфигурации, что означает, что для Linux / etc / hosts
получит дополнительные строки:
162.242.195.82 somehost
50.31.209.229 другой хост
group_add
group_add
определяет дополнительные группы (по имени или номеру), членом которых ДОЛЖЕН быть пользователь внутри контейнера.
Пример того, где это полезно, - когда несколько контейнеров (работающих как разные пользователи) должны все читать или писать
тот же файл на общем томе. Этот файл может принадлежать группе, совместно используемой всеми контейнерами, и указанной в group_add
.
услуг: myservice: изображение: альпийский group_add: - почта
Запуск id
внутри созданного контейнера ДОЛЖЕН показывать, что пользователь принадлежит к группе mail
, которая не будет иметь
имело место, если не было объявлено group_add
.
проверка работоспособности
healthcheck
объявляет проверку, которая запускается, чтобы определить, есть ли контейнеры для этого
сервис "здоровый". Это отменяет
Инструкция HEALTHCHECK Dockerfile
устанавливается Docker-образом службы.
проверка работоспособности: test: ["CMD", "curl", "-f", "http: // localhost"] интервал: 1 мин 30 сек тайм-аут: 10 с повторных попыток: 3 start_period: 40 с
интервал
, тайм-аут
и start_period
указаны как длительности.
test
определяет команду, которую реализация Compose будет запускать для проверки работоспособности контейнера. Может быть
либо строка, либо список. Если это список, первый элемент должен быть NONE
, CMD
или CMD-SHELL
.
Если это строка, это эквивалентно указанию CMD-SHELL
, за которым следует эта строка.
# Нажмите на локальное веб-приложение тест: ["CMD", "curl", "-f", "http: // localhost"]
Использование CMD-SHELL
запустит команду, сконфигурированную как строку, используя оболочку контейнера по умолчанию.
( / bin / sh
для Linux).Обе формы ниже эквивалентны:
тест: ["CMD-SHELL", "curl -f http: // localhost || exit 1"]
тест: curl -f https: // localhost || выход 1
НЕТ
отключает проверку работоспособности и в основном полезен для отключения проверки работоспособности, установленной образом. Альтернативно
проверку работоспособности, установленную изображением, можно отключить, установив disable: true
:
проверка работоспособности: отключить: true
имя хоста
hostname
объявляет настраиваемое имя хоста для использования в сервисном контейнере.ДОЛЖНО быть допустимым именем хоста RFC 1123.
изображение
image
указывает образ, с которого будет запускаться контейнер. Изображение ДОЛЖНО соответствовать спецификации открытого контейнера
адресный формат изображения,
как [
.
изображение: redis изображение: redis: 5 изображение: redis @ sha356: 0ed5d5928d4737458944eb604cc8509e245c3e19d02ad838bc4b991aac7 изображение: библиотека / redis изображение: docker.io/library/redis изображение: my_private.реестр: 5000 / redis
Если изображение не существует на платформе, реализации Compose ДОЛЖНЫ попытаться извлечь его на основе pull_policy
.
Реализации Compose с поддержкой сборки МОГУТ предлагать конечному пользователю альтернативные варианты управления приоритетом
потянуть за создание изображения из источника, однако вытягивание изображения ДОЛЖНО быть поведением по умолчанию.
изображение
МОЖЕТ быть опущено в файле Compose, если объявлен раздел build
.Составьте реализации
без поддержки сборки НЕОБХОДИМО завершиться ошибкой, если изображение
отсутствует в файле Compose.
инициализации
init
запускает процесс init (PID 1) внутри контейнера, который пересылает сигналы и пересылает процессы.
Установите для этого параметра значение true
, чтобы включить эту функцию для службы.
услуг: Интернет: изображение: альпийский: последний init: true
Используемый двоичный файл инициализации зависит от платформы.
ipc
ipc
настраивает режим изоляции IPC, установленный сервисным контейнером.Имеется в наличии
значения зависят от платформы, но спецификация Compose определяет конкретные значения
которые ДОЛЖНЫ быть реализованы, как описано, если поддерживается:
-
разделяемый
, который дает контейнеру собственное частное пространство имен IPC с возможность поделиться им с другими контейнерами. -
услуга: {name}
, которая объединяет контейнер с другим (разделяемый
) пространство имен IPC контейнера.
IPC: «общий» ipc: "служба: [название службы]"
изоляция
изоляция
определяет технологию изоляции контейнера.Поддерживаемые значения зависят от платформы.
этикеток
метки
добавляют метаданные в контейнеры. Вы можете использовать массив или карту.
Рекомендуется использовать нотацию обратного DNS, чтобы ваши метки не конфликтовали с те, которые используются другим программным обеспечением.
этикеток: com.example.description: "Веб-приложение для бухгалтерского учета" com.example.department: «Финансы» com.example.label-with-empty-value: ""
этикеток: - "com.example.description = Бухгалтерское веб-приложение" - «ком.example.department = Финансы " - "com.example.label-with-empty-value"
Реализации Compose ДОЛЖНЫ создавать контейнеры с каноническими метками:
-
com.docker.compose.project
установить для всех ресурсов, созданных реализацией Compose, для имени проекта пользователя -
com.docker.compose.service
, установленный в контейнерах служб с именем службы, как определено в файле Compose
Префикс метки com.docker.compose
зарезервирован.Указание меток с этим префиксом в файле Compose ДОЛЖНО
приведет к ошибке выполнения.
ссылок
ссылки
определяет сетевую ссылку на контейнеры в другой службе. Либо укажите имя службы и
псевдоним ссылки ( SERVICE: ALIAS
) или просто имя службы.
Интернет: ссылки: - дб - db: база данных - Redis
Контейнеры для связанной службы ДОЛЖНЫ быть доступны на имени хоста, идентичном псевдониму, или имени службы. если не указан псевдоним.
Ссылки не требуются для того, чтобы службы могли обмениваться данными - когда не задана конкретная конфигурация сети,
любая служба ДОЛЖНА иметь доступ к любой другой службе с именем этой службы в сети по умолчанию
. Если услуги
объявляют сети, к которым они подключены, ссылки
НЕ ДОЛЖНЫ переопределять конфигурацию сети, а службы не
подключенный к общей сети, НЕ ДОЛЖЕН иметь возможность общаться. Реализации Compose НЕ МОГУТ предупреждать пользователя
об этом несоответствии конфигурации.
Ссылки также выражают неявную зависимость между службами так же, как зависимости_on, поэтому они определяют порядок запуска службы.
лесозаготовка
ведение журнала
определяет конфигурацию ведения журнала для службы.
регистрация: драйвер: системный журнал опции: адрес системного журнала: "tcp: //192.168.0.42: 123"
Драйвер Имя
определяет драйвер ведения журнала для контейнеров службы. Значения по умолчанию и доступные значения
зависят от платформы.Параметры драйвера могут быть установлены с помощью параметров
в виде пар ключ-значение.
network_mode
network_mode
установить сетевой режим служебных контейнеров. Доступные значения зависят от платформы, но Compose
Спецификация определяет конкретные значения, которые ДОЛЖНЫ быть реализованы, как описано, если поддерживается:
-
нет
, которые отключают все сети контейнеров -
хост
, который предоставляет контейнеру необработанный доступ к сетевому интерфейсу хоста -
служба: {name}
, которая дает контейнерам доступ только к указанной службе
network_mode: "хост" network_mode: "нет" network_mode: "service: [название службы]"
сетей
сети
определяет сети, к которым подключены сервисные контейнеры, ссылаясь на записи в
сети верхнего уровня
ключ.
услуг: какой-то сервис: сети: - какая-то сеть - другие сети
псевдонимов
aliases
объявляет альтернативные имена хостов для этой службы в сети. Другие контейнеры на том же
network может использовать имя службы или этот псевдоним для подключения к одному из контейнеров службы.
Поскольку псевдонимы
относятся к сети, одна и та же служба может иметь разные псевдонимы в разных сетях.
Примечание : Псевдоним в масштабе всей сети может использоваться несколькими контейнерами и даже несколькими службами.Если это так, то не гарантируется, в какой именно контейнер разрешается имя.
Здесь показан общий формат:
услуг: какой-то сервис: сети: какая-то сеть: псевдонимы: - псевдоним1 - псевдоним3 другая-сеть: псевдонимы: - псевдоним 2
В приведенном ниже примере служба внешнего интерфейса
сможет связаться с серверной службой
по адресу
имя хоста , бэкэнд
или , база данных
в сети back-tier
, и сервис , мониторинг
сможет получить доступ к той же бэкэнд-службе на
db
или mysql
в сети admin
.
услуг: внешний интерфейс: изображение: здорово / webapp сети: - передний ярус - задний ярус мониторинг: изображение: здорово / мониторинг сети: - админ бэкэнд: изображение: здорово / бэкэнд сети: задний ярус: псевдонимы: - база данных админ: псевдонимы: - MySQL сети: передний ярус: задний ярус: админ:
ipv4_address, ipv6_address
Укажите статический IP-адрес для контейнеров для этой службы при подключении к сети.
Соответствующая сетевая конфигурация в разделе сетей верхнего уровня ДОЛЖНА иметь ipam
блок с конфигурациями подсети, покрывающими каждый статический адрес.
услуг: внешний интерфейс: изображение: здорово / webapp сети: передний ярус: ipv4_address: 172.16.238.10 ipv6_address: 2001: 3984: 3989 :: 10 сети: передний ярус: ipam: драйвер: по умолчанию config: - подсеть: «172.16.238.0/24» - подсеть: «2001: 3984: 3989 :: / 64»
link_local_ips
link_local_ips
определяет список локальных IP-адресов канала.Link-local IP-адреса - это особые IP-адреса, которые принадлежат колодцу.
известная подсеть и полностью управляются оператором, обычно в зависимости от архитектуры, в которой они находятся
развернут. Реализация зависит от платформы.
Пример:
услуг: приложение: изображение: busybox команда: сверху сети: app_net: link_local_ips: - 57.123.22.11 - 57.123.22.13 сети: app_net: водитель: мост
приоритет
, приоритет
указывает, в каком порядке реализация Compose ДОЛЖНА подключать контейнеры службы к ее
сети.Если не указано, значение по умолчанию - 0.
В следующем примере служба приложения сначала подключается к app_net_1, поскольку она имеет наивысший приоритет. Затем он подключается к app_net_3, затем app_net_2, который использует значение приоритета по умолчанию 0.
услуг: приложение: изображение: busybox команда: сверху сети: app_net_1: приоритет: 1000 app_net_2: app_net_3: приоритет: 100 сети: app_net_1: app_net_2: app_net_3:
mac_address
mac_address
устанавливает MAC-адрес для сервисного контейнера.
mem_limit
УСТАРЕЛО: используйте deploy.limits.memory
mem_reservation
УСТАРЕЛО: используйте deploy.reservations.memory
mem_swappiness
mem_swappiness
определяет процентное значение (значение от 0 до 100), которое ядро хоста должно выгружать.
анонимные страницы памяти, используемые контейнером.
- значение 0 отключает анонимную подкачку страниц.
- значение 100 устанавливает все анонимные страницы как заменяемые.
Значение по умолчанию зависит от платформы.
memswap_limit
memswap_limit
определяет объем контейнера памяти, разрешенный для подкачки на диск. Это модификатор
атрибут, который имеет значение только в том случае, если память
также установлена. Использование подкачки позволяет контейнеру записывать лишнее.
требования к памяти для диска, когда контейнер исчерпал всю доступную ему память.
Приложения, которые часто переключают память на диск, снижают производительность.
- Если для
memswap_limit
установлено положительное целое число, то ДОЛЖНЫ быть установлены иmemory
, иmemswap_limit
.memswap_limit
представляет общий объем памяти и подкачки, который можно использовать, апамять
управляет объемом, используемым памятью без подкачки. Таким образом, еслипамять
= "300 м" иmemswap_limit
= "1 г", контейнер может использовать 300 м памяти и 700 м (1 г - 300 м) подкачки. - Если для
memswap_limit
установлено значение 0, параметр ДОЛЖЕН игнорироваться, и значение считается неустановленным. - Если для
memswap_limit
установлено то же значение, что и для памяти - Если
memswap_limit
не задан, апамять
установлена, контейнер может использовать столько подкачки, сколько установленопамяти
, если в хост-контейнере настроена память подкачки. Например, еслиmemory
= "300m" иmemswap_limit
не установлен, контейнер может использовать 600m памяти и свопинга. - Если для
memswap_limit
явно задано значение -1, контейнеру разрешено использовать неограниченный своп в пределах суммы, доступной в хост-системе.
oom_kill_disable
Если установлен oom_kill_disable
Реализация Compose ДОЛЖНА сконфигурировать платформу так, чтобы она не убивала контейнер в случае
голодной памяти.
oom_score_adj
oom_score_adj
настраивает предпочтение для контейнеров, которые будут уничтожены платформой в случае нехватки памяти.Значение ДОЛЖНО
находиться в диапазоне [-1000,1000].
pid
pid
устанавливает режим PID для контейнера, созданного реализацией Compose.
Поддерживаемые значения зависят от платформы.
pids_limit
pids_limit
настраивает ограничение PID контейнера. Установите -1 для неограниченного числа PID.
платформа
платформа
определяет контейнеры целевой платформы для этой службы с использованием синтаксиса os [/ arch [/ variant]]
.Реализация Compose ДОЛЖНА использовать этот атрибут при объявлении, чтобы определить, какая версия изображения будет извлечена.
и / или на какой платформе будет выполняться сборка сервиса.
: osx платформа: windows / amd64 платформа: linux / arm64 / v8
портов
Открывает контейнерные порты.
Отображение портов НЕ ДОЛЖНО использоваться с network_mode: host
, и это ДОЛЖНО привести к ошибке времени выполнения.
Краткий синтаксис
Короткий синтаксис - это разделенная запятыми строка для установки IP-адреса хоста, порта хоста и порта контейнера. по форме:
[HOST:] CONTAINER [/ PROTOCOL]
где:
-
HOST
- это[IP:] (порт | диапазон)
-
КОНТЕЙНЕР
порт| диапазон
-
ПРОТОКОЛ
для ограничения порта указанным протоколом.tcp
иudp
значения определены в спецификации, Реализации Compose МОГУТ предлагать поддержку имен протоколов, зависящих от платформы.
IP-адрес хоста, если не установлен, ДОЛЖЕН быть привязан ко всем сетевым интерфейсам. Порт может быть как одиночным значение или диапазон. Хост и контейнер ДОЛЖНЫ использовать эквивалентные диапазоны.
Укажите оба порта ( HOST: CONTAINER
) или только порт контейнера. В последнем случае
Реализация Compose ДОЛЖНА автоматически выделять любой неназначенный порт хоста.
HOST: CONTAINER
ДОЛЖЕН всегда указываться как строка (заключенная в кавычки), чтобы избежать конфликтов.
с поплавком ямл base-60.
Образцов:
портов: - «3000» - «3000-3005» - «8000: 8000» - «9090-9091: 8080-8081» - «49100: 22» - «127.0.0.1:8001:8001» - «127.0.0.1:5000-5010:5000-5010» - «6060: 6060 / udp»
Примечание : Сопоставление IP-адресов хоста МОЖЕТ не поддерживаться на платформе, в таком случае реализации Compose СЛЕДУЕТ отклонять файл Compose и ДОЛЖЕН сообщить пользователю, что он проигнорирует указанный IP-адрес хоста.
Длинный синтаксис
Синтаксис полной формы позволяет настраивать дополнительные поля, которые не могут быть выражается в краткой форме.
-
цель
: контейнерный порт -
опубликовано
: публично открытый порт -
host_ip
: неуказанное сопоставление IP-адресов хоста означает все сетевые интерфейсы (0.0.0.0
) -
протокол
: протокол порта (tcp
илиudp
), неуказанный означает любой протокол -
режим
:хост
для публикации порта хоста на каждом узле иливход
для порта для балансировки нагрузки.
портов: - Цель: 80 host_ip: 127.0.0.1 опубликовано: 8080 протокол: tcp режим: хост
привилегированный
с привилегиями
настраивает контейнер службы для работы с повышенными привилегиями. Поддержка и фактическое воздействие зависят от платформы.
профилей
профилей
определяет список именованных профилей для службы, которая будет включена. Если не установлен, служба всегда включена.
Если присутствует, профиль
ДОЛЖЕН следовать формату регулярного выражения [a-zA-Z0-9] [a-zA-Z0-9_.-] +
.
pull_policy
pull_policy
определяет решения, которые будут принимать реализации Compose, когда они начинают извлекать изображения. Возможные значения:
-
всегда
: реализации Compose ДОЛЖНЫ всегда извлекать образ из реестра. -
никогда.
: реализации Compose НЕ ДОЛЖНЫ извлекать образ из реестра и ДОЛЖНЫ полагаться на кэшированный образ платформы. Если кэшированного изображения нет, НЕОБХОДИМО сообщить об ошибке. -
отсутствует
: реализациям Compose СЛЕДУЕТ извлекать изображение только в том случае, если оно недоступно в кэше платформы. Это ДОЛЖНО быть опцией по умолчанию для реализаций Compose без поддержки сборки.if_not_present
СЛЕДУЕТ рассматривать как псевдоним для этого значения для обратной совместимости -
build
: реализации Compose ДОЛЖНЫ создавать образ. Реализации Compose ДОЛЖНЫ перестраивать образ, если он уже присутствует.
Если присутствуют pull_policy
и build
, реализациям Compose СЛЕДУЕТ строить образ по умолчанию.Реализации Compose МОГУТ переопределить это поведение в цепочке инструментов.
только чтение
read_only
настраивает создание контейнера службы с файловой системой, доступной только для чтения.
перезапуск
перезапуск
определяет политику, которую платформа будет применять при завершении работы контейнера.
-
нет
: Политика перезапуска по умолчанию. Не перезапускает контейнер ни при каких обстоятельствах. -
всегда
: политика всегда перезапускает контейнер до его удаления. -
при сбое
: политика перезапускает контейнер, если код выхода указывает на ошибку. -
без остановки
: политика перезапускает контейнер независимо от кода выхода, но останавливается перезапуск при остановке или удалении службы.
перезапуск: «нет» перезапуск: всегда перезапуск: при сбое перезапуск: если не остановлен
время выполнения
среда выполнения
указывает, какую среду выполнения использовать для контейнеров службы.
Значение время выполнения
зависит от реализации.
Например, среда выполнения
может быть именем реализации спецификации времени выполнения OCI, например runc.
Интернет: изображение: busybox: последний команда: true время выполнения: runc
масштаб
-УСТАРЕЛО: используйте deploy / replicas_
Масштаб
указывает количество контейнеров по умолчанию для развертывания для этой службы.
секретов
секретов
предоставляет доступ к конфиденциальным данным, определяемым секретами, для каждой услуги.Два
поддерживаются различные варианты синтаксиса: короткий синтаксис и длинный синтаксис.
Compose ДОЛЖНЫ сообщать об ошибке, если секрет не существует на платформе или не определен в секреты
раздела этого файла Compose.
Краткий синтаксис
В сокращенном варианте синтаксиса указывается только секретное имя. Это дает
доступ контейнера к секрету и монтирует его как доступный только для чтения в / run / secrets /
внутри контейнера.Устанавливаются как имя источника, так и конечная точка монтирования.
к секретному имени.
В следующем примере короткий синтаксис используется для предоставления службы внешнего интерфейса .
доступ к серверу -сертификат
секрет. Установлено значение server-certificate
к содержимому файла ./server.cert
.
услуг: внешний интерфейс: изображение: здорово / webapp секреты: - сервер-сертификат секреты: сервер-сертификат: файл: ./server.cert
Длинный синтаксис
Длинный синтаксис обеспечивает большую детализацию того, как секрет создается внутри контейнеры сервиса.
-
источник
: имя секрета в том виде, в котором он существует на платформе. -
target
: имя файла, который нужно смонтировать в/ run / secrets /
в контейнеры задач службы. По умолчанию используетсяисточник
, если не указано иное. -
uid
иgid
: числовой UID или GID, которому принадлежит файл в/ run / secrets /
в контейнерах задач службы. Значение по умолчанию — запущенный контейнер USER. -
режим
: разрешения для монтируемого файла в/ run / secrets /
в контейнерах задач службы в восьмеричной системе счисления.Значение по умолчанию — разрешения для чтения всем (режим0444
). Бит записи ДОЛЖЕН игнорироваться, если установлен. МОЖЕТ быть установлен исполняемый бит.
В следующем примере для секретного файла server-certificate
устанавливается имя server.crt
.
внутри контейнера, устанавливает режим 0440
(групповое чтение) и устанавливает пользователя и группу
на номер 103
. Значение server-certificate
secret предоставляется платформой через поиск и
секретный жизненный цикл, не управляемый напрямую реализацией Compose.
услуг: внешний интерфейс: изображение: здорово / webapp секреты: - источник: сервер-сертификат цель: server.cert uid: "103" gid: "103" режим: 0440 секреты: сервер-сертификат: внешний: истинныйСлужбам
МОЖЕТ быть предоставлен доступ к нескольким секретам. Длинный и короткий синтаксис секретов МОЖЕТ использоваться в
тот же файл Compose. Определение секрета в секретах верхнего уровня
MUTS НЕ подразумевает предоставление к нему доступа какой-либо службы.
Такое разрешение должно быть явным в спецификации службы как элемент службы секретов.
security_opt
security_opt
отменяет схему маркировки по умолчанию для каждого контейнера.
security_opt: - ярлык: пользователь: ПОЛЬЗОВАТЕЛЬ - метка: role: ROLE
размер
shm_size
настраивает размер разделяемой памяти (раздел / dev / shm
в Linux), разрешенный сервисным контейнером.
Указывается как байтовое значение.
stdin_open
stdin_open
настраивает контейнеры служб для работы с выделенным стандартным вводом.
stop_grace_period
stop_grace_period
указывает, как долго реализация Compose ДОЛЖНА ждать при попытке остановить контейнер, если это не так.
обработать SIGTERM (или любой сигнал остановки, указанный с stop_signal
) перед отправкой SIGKILL. Указано
как продолжительность.
stop_grace_period: 1 с stop_grace_period: 1 мин. 30 сек.
Значение по умолчанию — 10 секунд для выхода контейнера перед отправкой SIGKILL.
stop_signal
stop_signal
определяет сигнал, который реализация Compose ДОЛЖНА использовать для остановки контейнеров служб.Если неустановленные контейнеры останавливаются реализацией Compose путем отправки SIGTERM
.
storage_opt
storage_opt
определяет параметры драйвера хранилища для службы.
sysctls
sysctls
определяет параметры ядра для установки в контейнере. sysctls
может использовать либо массив, либо карту.
систем: net.core.somaxconn: 1024 net.ipv4.tcp_syncookies: 0
систем: - net.core.somaxconn = 1024 - сеть.ipv4.tcp_syncookies = 0
Вы можете использовать только sysctls, которые находятся в пространстве имен в ядре. Докер не поддержка изменения sysctls внутри контейнера, который также изменяет хост-систему. Для обзора поддерживаемых sysctl обратитесь к настройке ядра с пространством имен. параметры (sysctls) во время выполнения.
tmpfs
tmpfs
монтирует временную файловую систему внутри контейнера. Может быть одиночным значением или списком.
tty
tty
настроить сервисный контейнер для работы с TTY.
ulimits
ulimits
переопределяет ulimits по умолчанию для контейнера. Либо указывает как единичный предел как целое число, либо
мягкие / жесткие ограничения как отображение.
ограничений: nproc: 65535 Нет файла: мягкий: 20000 жесткий: 40000
пользователь
Пользователь
переопределяет пользователя, использованного для запуска процесса контейнера. По умолчанию установлен образ (например, Dockerfile USER
),
если не установлен, корень
.
userns_mode
userns_mode
устанавливает пространство имен пользователя для службы.Поддерживаемые значения зависят от платформы и МОГУТ зависеть
на платформе конфигурации
томов
тома
определяет пути монтирования хостов или именованные тома, которые ДОЛЖНЫ быть доступны для сервисных контейнеров.
Если монтирование является путем к хосту и используется только одной службой, оно МОЖЕТ быть объявлено как часть службы.
определение вместо верхнего уровня тома
ключ.
Для повторного использования тома в нескольких службах именованный
том ДОЛЖЕН быть объявлен в ключе тома верхнего уровня
.
В этом примере показан именованный том ( db-data
), используемый серверной службой
,
и привязка, определенная для одной службы
услуг: бэкэнд: изображение: здорово / бэкэнд объемы: - тип: объемный источник: db-data цель: / данные объем: nocopy: правда - тип: привязать источник: /var/run/postgres/postgres.sock цель: /var/run/postgres/postgres.sock объемы: db-данные:
Краткий синтаксис
В коротком синтаксисе используется одна строка со значениями, разделенными запятыми, для указания монтирования тома.
( VOLUME: CONTAINER_PATH
) или режим доступа ( VOLUME: CONTAINER: ACCESS_MODE
).
ТОМ
МОЖЕТ быть либо путем к хосту на платформе, на которой размещены контейнеры (привязка монтирования), либо именем тома. ACCESS_MODE
МОЖЕТ быть установлен как доступный только для чтения с помощью ro
или для чтения и записи с использованием rw
(по умолчанию).
Примечание : Относительные пути хоста ДОЛЖНЫ поддерживаться только реализациями Compose, которые развертываются в локальная среда выполнения контейнера. Это связано с тем, что относительный путь определяется из родительского файла Compose каталог, который применим только в локальном случае.Компоновка реализаций, развертываемых на нелокальном платформа ДОЛЖНА отклонить файлы Compose, которые используют относительные пути к хостам с ошибкой. Чтобы избежать двусмысленности с именованными томами относительные пути ДОЛЖНЫ начинаться с
.
или..
.
Длинный синтаксис
Синтаксис полной формы позволяет настраивать дополнительные поля, которые не могут быть выражается в краткой форме.
-
тип
: крепление типаобъем
, привязкаtmpfs
илиnpipe
-
источник
: источник монтирования, путь на хосте для подключения привязки или имя тома, определенное в топ-уровеньтома
ключ.Не применимо для монтирования tmpfs. -
target
: путь в контейнере, где установлен том -
read_only
: флаг для установки тома как доступного только для чтения -
привязка
: настройка дополнительных параметров привязки-
распространение
: режим распространения, используемый для привязки -
create_host_path
: создать каталог по исходному пути на хосте, если там ничего нет. Ничего не делайте, если на пути что-то есть.Это автоматически подразумевается коротким синтаксисом для обратной совместимости с устаревшей версией docker-compose.
-
-
volume
: настройка дополнительных параметров тома-
nocopy
: флаг для отключения копирования данных из контейнера при создании тома
-
-
tmpfs
: настройка дополнительных параметров tmpfs-
размер
: размер для монтирования tmpfs в байтах
-
-
согласованность
: согласованность требований крепления.Доступные значения зависят от платформы
томов_от
volume_from
монтирует все тома из другой службы или контейнера, при необходимости указывая
доступ только для чтения (ro) или чтение-запись (rw). Если уровень доступа не указан, ДОЛЖНО использоваться чтение-запись.
Строковое значение определяет другую службу в модели приложения Compose, из которой монтируются тома. В
Контейнер : префикс
, если он поддерживается, позволяет монтировать тома из контейнера, который не управляется
Составьте реализацию.
томов_от: - наименование услуги - имя_службы: ro - контейнер: имя_контейнера - контейнер: имя_контейнера: rw
рабочий_директор
working_dir
заменяет рабочий каталог контейнера, указанный в образе (например, Dockerfile WORKDIR
).
Элемент верхнего уровня сети
Сети — это уровень, позволяющий службам взаимодействовать друг с другом. Сетевая модель, представленная сервису ограничивается простым IP-соединением с целевыми службами и внешними ресурсами, в то время как определение сети позволяет доработка фактической реализации, предоставляемой платформой.
Сети могут быть созданы путем указания имени сети в разделе верхнего уровня сетей
.
Службы могут подключаться к сетям, указав имя сети в разделе
сети
. В следующем примере во время выполнения будут созданы сети переднего уровня
и заднего уровня
и служба внешнего интерфейса
подключен к сети переднего уровня
и к сети заднего уровня .
услуг: внешний интерфейс: изображение: здорово / webapp сети: - передний ярус - задний ярус сети: передний ярус: задний ярус:
драйвер
драйвер
указывает, какой драйвер должен использоваться для этой сети.Реализации Compose ДОЛЖНЫ возвращать ошибку, если
драйвер недоступен на платформе.
Значения по умолчанию и доступные значения зависят от платформы. Спецификация Compose ДОЛЖНА поддерживать следующие конкретные драйверы: нет
и хост
-
хост
использовать сетевой стек хоста -
нет
отключить сеть
хост или нет
Синтаксис для использования встроенных сетей, таких как хост
и нет
отличается, поскольку такие сети неявно существуют вне
объем реализации Compose.Для их использования НЕОБХОДИМО определить внешнюю сеть с именем host
или none
и
псевдоним, который может использовать реализация Compose ( hostnet
или nonet
в следующих примерах), а затем предоставить сервис
доступ к этой сети, используя ее псевдоним.
услуг: Интернет: сети: hostnet: {} сети: hostnet: внешний: правда имя: хост
услуг: Интернет: ... сети: nonet: {} сети: нонет: внешний: правда имя: нет
driver_opts
driver_opts
задает список параметров в виде пар "ключ-значение" для передачи драйверу для этой сети.Эти варианты
зависит от драйвера - обратитесь к документации по драйверу для получения дополнительной информации. По желанию.
driver_opts: foo: "бар" баз: 1
присоединяемый
Если присоединяемый
установлен на истинный
, то автономные контейнеры ДОЛЖНЫ иметь возможность подключаться к этой сети в дополнение к службам.
Если автономный контейнер подключается к сети, он может взаимодействовать со службами и другими автономными контейнерами.
которые также подключены к сети.
сетей: mynet1: драйвер: оверлей присоединяемый: правда
enable_ipv6
enable_ipv6
включить сеть IPv6 в этой сети.
ipam
ipam
указывает индивидуальную конфигурацию IPAM. Это объект с несколькими свойствами, каждое из которых является необязательным:
-
драйвер
: настраиваемый драйвер IPAM вместо стандартного. -
config
: список с нулевым или более элементами конфигурации, каждый из которых содержит:-
подсеть
: Подсеть в формате CIDR, представляющая сегмент сети -
ip_range
: диапазон IP-адресов, из которых следует выделить IP-адреса контейнера -
шлюз
: шлюз IPv4 или IPv6 для основной подсети -
aux_addresses
: Дополнительные адреса IPv4 или IPv6, используемые сетевым драйвером, как отображение имени хоста на IP
-
-
параметры
: параметры драйвера в виде сопоставления «ключ-значение».
Полный пример:
IPAM: драйвер: по умолчанию config: - подсеть: 172.28.0.0/16 ip_range: 172.28.5.0/24 шлюз: 172.28.5.254 aux_addresses: host1: 172.28.1.5 хост2: 172.28.1.6 host3: 172.28.1.7 опции: foo: bar baz: "0"
внутренний
По умолчанию реализации Compose ДОЛЖНЫ обеспечивать внешнее подключение к сетям. внутренний
при установке на истинный
разрешить
создать внешне изолированную сеть.
этикеток
Добавьте метаданные в контейнеры с помощью меток. Может использовать массив или словарь.
Пользователи ДОЛЖНЫ использовать нотацию обратного DNS, чтобы предотвратить конфликты меток с метками, используемыми другим программным обеспечением.
этикеток: com.example.description: «Сеть финансовых транзакций» com.example.department: «Финансы» com.example.label-with-empty-value: ""
этикеток: - "com.example.description = Сеть финансовых транзакций" - "com.example.department = Финансы" - «ком.example.label-with-empty-value "Реализации
Compose ДОЛЖНЫ устанавливать метки com.docker.compose.project
и com.docker.compose.network
.
внешний
Если установлено значение true
, external
указывает, что жизненный цикл этой сети поддерживается вне жизненного цикла приложения.
Реализациям Compose НЕ СЛЕДУЕТ пытаться создать эти сети и выдает ошибку, если таковая не существует.
В приведенном ниже примере прокси-сервер
является шлюзом во внешний мир.Вместо того, чтобы пытаться создать сеть, напишите
реализации ДОЛЖНЫ опрашивать платформу для существующей сети, просто называемой вне
, и подключать проксирует к нему контейнеры сервиса
.
услуг: прокси: изображение: здорово / прокси сети: - за пределами - дефолт приложение: изображение: здорово / приложение сети: - дефолт сети: за пределами: внешний: истинный
название
имя
устанавливает собственное имя для этой сети.Поле имени может использоваться для ссылки на сети, содержащие специальные символы.
Имя используется как есть, и область действия , а не будет ограничена именем проекта.
сетей: сеть1: имя: my-app-net
Его также можно использовать вместе со свойством external
для определения сети платформы, которую реализация Compose
должен извлекаться, как правило, с использованием параметра, поэтому в файле Compose не требуется жестко запрограммировать конкретные значения времени выполнения:
сетей: сеть1: внешний: правда имя: "$ {NETWORK_ID}"
Объемный элемент верхнего уровня
Тома - это постоянные хранилища данных, реализованные платформой.Спецификация Compose предлагает нейтральную абстракцию для служб для монтирования томов и параметров конфигурации для их размещения в инфраструктуре.
Раздел тома
позволяет конфигурировать именованные тома, которые можно повторно использовать в нескольких службах. Вот
пример настройки с двумя службами, где каталог данных базы данных используется совместно с другой службой в качестве тома, поэтому
что его можно периодически создавать резервные копии:
услуг: бэкэнд: изображение: здорово / база данных объемы: - db-данные: / etc / data резервное копирование: изображение: служба резервного копирования объемы: - данные базы данных: / var / lib / backup / data объемы: db-данные:
Запись под ключом томов верхнего уровня
может быть пустой, и в этом случае она использует конфигурацию платформы по умолчанию для
создание объема.При желании вы можете настроить его с помощью следующих ключей:
драйвер
Укажите, какой драйвер тома следует использовать для этого тома. Значения по умолчанию и доступные значения зависят от платформы. Если драйвер недоступен, реализация Compose ДОЛЖНА вернуть ошибку и остановить развертывание приложения.
driver_opts
driver_opts
определяет список параметров в виде пар "ключ-значение" для передачи драйверу для этого тома. Эти параметры зависят от драйвера.
томов: пример: driver_opts: тип: "nfs" o: "addr = 10.40.0.199, nolock, soft, rw" устройство: ": / docker / example"
внешний
Если установлено значение true
, external
указывает, что этот том уже существует на платформе и его жизненный цикл управляется извне.
из приложения. Реализации Compose НЕ ДОЛЖНЫ пытаться создать эти тома и ДОЛЖНЫ возвращать ошибку, если они
не существует.
В приведенном ниже примере вместо попытки создать том с именем {project_name} _data
, Compose просто ищет существующий том
называется data
и монтирует его в сервисные контейнеры db
.
услуг: бэкэнд: изображение: здорово / база данных объемы: - db-данные: / etc / data объемы: db-данные: внешний: истинный
этикеток
метки
используются для добавления метаданных к томам. Вы можете использовать массив или словарь.
Рекомендуется использовать обратную нотацию DNS, чтобы ваши метки не противоречащие тем, которые используются другим программным обеспечением.
этикеток: com.example.description: «Объем базы данных» com.example.отдел: «IT / Ops» com.example.label-with-empty-value: ""
этикеток: - "com.example.description = Объем базы данных" - "com.example.department = IT / Ops" - "com.example.label-with-empty-value"Реализация
Compose ДОЛЖНА установить метки com.docker.compose.project
и com.docker.compose.volume
.
название
имя
задает собственное имя для этого тома. Поле имени можно использовать для ссылки на тома, которые содержат специальные
персонажи.Имя используется как есть, и область , а не будет ограничена именем стека.
томов: данные: name: "my-app-data"
Его также можно использовать вместе с внешним свойством
. При этом имя тома, которое использовалось для поиска
фактический объем на платформе устанавливается отдельно от имени, используемого для ссылки на него в файле Compose:
томов: db-данные: внешний: имя: фактическое-имя-тома
Это позволяет сделать это имя поиска параметром файла Compose, так что идентификатор модели для тома жестко запрограммирован, но фактический идентификатор тома на платформе устанавливается во время выполнения во время развертывания:
томов: db-данные: внешний: имя: $ {DATABASE_VOLUME}
Конфигурация элемента верхнего уровня
Конфигурациипозволяют службам адаптировать свое поведение без необходимости перестраивать образ Docker.Конфигурации сопоставимы с томами с точки зрения обслуживания, поскольку они монтируются в файловую систему контейнеров службы. Фактические детали реализации для получения конфигурации, предоставляемой платформой, могут быть установлены из определения конфигурации.
При предоставлении доступа к конфигурации содержимое конфигурации монтируется как файл в контейнере. Местоположение точки монтирования в контейнере по умолчанию - /
в контейнерах Linux и C: \
в контейнерах Windows.
По умолчанию, конфигурация ДОЛЖНА принадлежать пользователю, выполняющему команду контейнера, но может быть переопределена конфигурацией службы. По умолчанию конфигурация ДОЛЖНА иметь права доступа для чтения всем (режим 0444), если только служба не настроена для переопределения этого.
Службы могут получить доступ к конфигурациям только в том случае, если это явно предоставлено подразделом config
.
Конфиги верхнего уровня , декларация
определяет или ссылается
данные конфигурации, которые могут быть предоставлены службам в этом
применение.Источником конфигурации является либо файл
, либо внешний
.
-
файл
: Конфигурация создается с содержимым файла по указанному пути. -
external
: Если установлено значение true, указывает, что эта конфигурация уже была создана. Compose реализация не пытается создать его, и если он не существует, возникает ошибка. -
имя
: Имя объекта конфигурации на платформе для поиска. Это поле можно использовать для справочные конфигурации, содержащие специальные символы.Имя используется как есть и область действия , а не будет ограничена именем проекта.
В этом примере создается http_config
(как
) при развертывании приложения,
и my_second_config
ДОЛЖЕН уже существовать на платформе, и значение будет получено путем поиска.
В этом примере server-http_config
создается как
при развертывании приложения,
зарегистрировав содержимое файла httpd.conf
как данные конфигурации.
: http_config: файл: ./httpd.conf
В качестве альтернативы, http_config
можно объявить как внешний, при этом реализация Compose будет искать server-certificate
, чтобы предоставить данные конфигурации соответствующим службам.
: http_config: внешний: истинный
Поиск внешних конфигураций также может использовать отдельный ключ, указав имя
. Следующие
Пример изменяет предыдущий для поиска конфигурации с помощью параметра HTTP_CONFIG_KEY
.Делает
поэтому фактический ключ поиска будет установлен во время развертывания путем интерполяции
переменные, но доступны контейнерам как жестко запрограммированный ID http_config
.
: http_config: внешний: правда имя: "$ {HTTP_CONFIG_KEY}"
Файл Compose должен явно предоставлять доступ к конфигурациям для соответствующих служб в приложении.
Секреты элемента верхнего уровня
Secrets - это разновидность конфигураций, ориентированных на конфиденциальные данные, с определенными ограничениями для этого использования.Поскольку реализация платформы может существенно отличаться от конфигураций, специальный раздел Секреты позволяет настроить соответствующие ресурсы.
Объявление секретов верхнего уровня
определяет или ссылается на конфиденциальные данные, которые могут быть предоставлены службам в этом
применение. Источником секрета является либо файл
, либо внешний
.
-
файл
: секрет создается из содержимого файла по указанному пути. -
external
: Если установлено значение true, указывает, что этот секрет уже был создан.Реализация Compose делает не пытайтесь создать его, и если он не существует, возникает ошибка. -
имя
: Имя секретного объекта в Docker. Это поле можно использовать для ссылочные секреты, содержащие специальные символы. Имя используется как есть и область действия , а не будет ограничена именем проекта.
В этом примере server-certificate
создается как
при развертывании приложения,
путем регистрации содержимого сервера .cert
как секрет платформы.
секретов: сервер-сертификат: файл: ./server.cert
В качестве альтернативы, server-certificate
может быть объявлен как внешний, при этом реализация Compose будет искать server-certificate
, чтобы раскрыть секрет для соответствующих служб.
секретов: сервер-сертификат: внешний: истинный
Поиск внешних секретов также может использовать отдельный ключ, указав имя
. Следующие
Пример изменяет предыдущий для поиска секрета с помощью параметра CERTIFICATE_KEY
.Делает
поэтому фактический ключ поиска будет установлен во время развертывания путем интерполяции
переменные, но доступны контейнерам как жестко запрограммированный ID server-certificate
.
секретов: сервер-сертификат: внешний: правда имя: "$ {CERTIFICATE_KEY}"
Файл Compose должен явно предоставлять доступ к секретам для соответствующих служб в приложении.
Фрагменты
Можно повторно использовать фрагменты конфигурации с помощью якорей YAML.
томов: db-data: & объем по умолчанию драйвер: по умолчанию метрики: * объем по умолчанию
В предыдущем примере привязка создана как объем по умолчанию
на основе спецификации объема db-data
.Позже он повторно используется псевдонимом * default-volume
для определения метрики
volume. Та же логика может применяться к любому элементу в файле Compose. Разрешение привязки ДОЛЖНО иметь место
перед интерполяцией переменных, поэтому переменные нельзя использовать для установки якорей или псевдонимов.
Также возможно частично переопределить значения, установленные ссылкой привязки, с помощью
Тип слияния YAML. В следующем примере для метрики в спецификации объема
используется псевдоним.
чтобы избежать повторения, но переопределить имя
атрибут:
услуг: бэкэнд: изображение: здорово / база данных объемы: - db-данные - метрики объемы: db-data: & объем по умолчанию драйвер: по умолчанию имя: "данные" метрики: <<: * объем по умолчанию имя: "метрики"
Добавочный номер
Специальные поля расширения могут иметь любой формат, если их имя начинается с последовательности символов x-
.Их можно использовать
внутри любой структуры в файле Compose. Это единственное исключение для реализаций Compose, которые молча игнорируют нераспознанное поле.
x-обычай: foo: - бар - зот Сервисы: webapp: изображение: здорово / webapp x-foo: бар
Содержимое таких полей не определено спецификацией Compose и может использоваться для включения настраиваемых функций. Реализация Compose для обнаружения неизвестного поля расширения НЕ ДОЛЖНА давать сбой, но МОЖЕТ предупреждать о неизвестном поле.
Для расширений платформы настоятельно рекомендуется использовать префикс расширения по имени платформы / поставщика, точно так же, как браузеры добавляют поддержка пользовательских функций CSS
сервис: бэкэнд: развертывать: размещение: x-aws-role: "arn: aws: iam :: XXXXXXXXXXXX: role / foo" x-aws-region: "ес-запад-3" x-azure-region: "france-central"
Информационные исторические записки
Этот раздел носит информативный характер. На момент написания были известны следующие префиксы:
префикс | поставщик / организация |
---|---|
докер | Докер |
кубернетес | Кубернетес |
Использование расширений как фрагментов
С поддержкой полей расширения файл Compose можно записать следующим образом, чтобы улучшить читаемость повторно используемых фрагментов:
x-logging: & default-logging опции: макс-размер: «12 м» max-файл: "5" драйвер: json-файл Сервисы: внешний интерфейс: изображение: здорово / webapp ведение журнала: * ведение журнала по умолчанию бэкэнд: изображение: здорово / база данных ведение журнала: * ведение журнала по умолчанию
с указанием байтовых значений
Значение представляет байтовое значение в виде строки в формате {количество} {байтовая единица}
:
Поддерживаемые единицы: b
(байты), k
или kb
(килобайты), m
или mb
(мегабайты) и g
или gb
(гигабайты).
с указанием продолжительности
Значение выражает продолжительность в виде строки в форме {значение} {единица}
.
Поддерживаемые единицы: мкс,
(микросекунды), мс,
(миллисекунды), с,
(секунды), м,
(минуты) и ч,
(часы).
Значение может объединять несколько значений и использовать без разделителя.
10 мс
40-е годы
1 мин. 30 сек.
1ч5м30с20мс
Интерполяция
Значения в файле Compose могут быть заданы переменными и интерполированы во время выполнения.Создавайте файлы, используя Bash-подобный
синтаксис $ {VARIABLE}
Поддерживаются синтаксисы $ VARIABLE
и $ {VARIABLE}
. Значения по умолчанию могут быть определены в строке с использованием типичного синтаксиса оболочки:
последний
-
$ {VARIABLE: -default}
оценивается какпо умолчанию
, еслиVARIABLE
не задано или пустой в окружающей среде. -
$ {VARIABLE-default}
оценивается какпо умолчанию
, только еслиVARIABLE
не задано в окружающей среде.
Аналогичным образом следующий синтаксис позволяет указать обязательные переменные:
-
$ {VARIABLE:? Err}
выходит с сообщением об ошибке, содержащимerr
, еслиПЕРЕМЕННАЯ
не задана или пуста в среде. -
$ {VARIABLE? Err}
завершается с сообщением об ошибке, содержащимerr
, еслиПЕРЕМЕННАЯ
не задана в среде.
Другие расширенные функции в стиле оболочки, такие как $ {VARIABLE / foo / bar}
, не поддерживаются.
поддерживается спецификацией Compose.
Вы можете использовать $$
(знак двойного доллара), когда вашей конфигурации нужен буквальный
знак доллара. Это также не позволяет Compose интерполировать значение, поэтому $$
позволяет вам обращаться к переменным среды, которые вы не хотите обрабатывать
Сочинять.
Интернет: строить: . команда: "$$ VAR_NOT_INTERPOLATED_BY_COMPOSE"
Если реализация Compose не может разрешить замененную переменную и значение по умолчанию не определено, она ДОЛЖНА предупредить пользователя и замените переменную пустой строкой.
Поскольку любые значения в файле Compose могут быть интерполированы с заменой переменных, включая компактную строковую нотацию для сложных элементов ДОЛЖНА применяться интерполяция перед слиянием для каждого файла.
.