version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
--network host
-p 8080:80
будут игнорироваться. Если контейнер слушает на 80-м порту, это будет именно 80-й порт хоста. Соотв. не получится запустить одновременно несколько одинаковых сервисов в таком режиме. ./Composer
создать Dockerfile с чем-то подобным: FROM composer:latest
VOLUME ./data /data
RUN apt-get update && apt-get install git && git pull trololo && composer install
services:
composer:
build: ./Composer
depends_on
) следующие сервисы. Ожидаю что файлы из директории var/www/html попадут на хост в ./www
volumes:
- /папка_на_хосте:/папка_в_контейнере_1
- имя_тома:/папка_в_контейнере_2
После этого, если внутри контейнера в этой папке создаётся файл, он оказывается в папке_хоста или томе./var/www/html
— будь она папкой контейнера или смонтированной в него папкой хоста или томом докера. При запуске, если там пусто, файлы создаются / записываются контейнером.entrypoint.sh
, в который поместите логику инициализации приложения, в т.ч. копирование-создание файлов. Укажите его как ENTRYPOINT контейнера. docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
### или создать дата-volume и его приделать к контейнеру
docker volume create data_volume
docker run --name some-mysql -v data_volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
### так после выключения контейнера данные не пропадут, останутся в этом data_volume,
### который можно скопировать, подключить к другим контейнерам
mysqldump
или какая там у вас база. Бэкапы, в любом случае, делать необходимо. Поднять копию контейнера, импортировать в неё данные из дампа. Примеры команд для mysql в docker см. внизу в секции Creating database dumps:### Creating database dumps
docker exec some-mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /some/path/on/your/host/all-databases.sql
### Restoring data from dump files
docker exec -i some-mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /some/path/on/your/host/all-databases.sql
/bin/bash
, которая без терминала тут же заканчивает исполнение. -d
) bash
а какая-то долгоиграющая команда, mysqld или nginx, всё бы работало дольше.docker run -it --rm ubuntu
-i
интерактивный режим-t
подключает виртуальный терминал--rm
удалит контейнер сразу, как вы из него выйдетеdocker run -d ubuntu tail -f /dev/null
– тут команда-пустышка, которая будет выполняться бесконечно;docker run -t -d ubuntu
– тут подключён виртуальный терминал и bash не вылетит, а останется работать. package.json
находятся на хосте в текущей папке.docker run -it --rm -v "$PWD":/usr/src/app -w /usr/src/app node npm install
docker run \
-it \ // интерактивно и с терминалом
--rm \ // удалить контейнер после выхода
-v "$PWD":/usr/src/app \ // текущую папку на хосте смонтировать в контейнер
-w /usr/src/app \ // в конт. сделать текущей папкой смонтированную
node \ // образ с nodejs
npm install // команда
volumes:
db-data:
external: true
- db-data в данном примере этот каталог расположенный в одной директории с docker-compose.yml?Нет. Это именованный volume. Его фактическая папка спрятана где-то глубоко, можно посмотреть командой
docker volume inspect db-data
и изначально он пустой.В чем отличие от такой записи(является ли она корректная?):Такая запись первым параметром указывает не именованный volume, а подпапку в папке с- ./db-data:/var/lib/mysql/data
docker-compose.yml
Т.е. mysql получит папку со всем её содержимым по адресу, указанному вторым параметром.curl
или школьным file_get_contents()
дергать некий локальный URL.