Вариант А. Включите файлы в изображение. Это далеко не идеально, поскольку вы смешиваете файлы конфигурации со своим изображением (которое на самом деле должно содержать только ваши двоичные файлы, а не вашу конфигурацию), но удовлетворяет требованию использовать только docker-compose для отправки файлов.
Этот вариант достигается за счет использования docker-compose для создания вашего образа, и эта сборка отправит любые файлы из каталога сборки в удаленный механизм докеров. Ваш docker-compose.yml
будет выглядеть так:
version: '2'
services:
my-db-app:
build: db/.
image: custom-db
И db / Dockerfile будет выглядеть так:
FROM mysql:latest
COPY ./sql /sql
Точка входа / cmd останется без изменений. Вам нужно будет запустить docker-compose up --build
, если изображение уже существует и вам нужно изменить файлы sql.
Вариант Б: используйте том для хранения данных. Это невозможно сделать непосредственно внутри docker-compose. Однако это предпочтительный способ включения файлов вне изображения в контейнер. Вы можете заполнить том по сети с помощью интерфейса командной строки докера и перенаправления ввода вместе с такой командой, как tar, для упаковки и распаковки тех файлов, которые отправляются через stdin:
tar -cC sql . | docker run --rm -it -v sql-files:/sql \
busybox /bin/sh -c "tar -xC /sql"
Запустите это через скрипт, а затем пусть тот же скрипт отправит контейнер db, чтобы перезагрузить эту конфигурацию.
Вариант C: используйте какую-либо файловую систему, подключенную к сети. Если вы можете настроить NFS на хосте, на котором запущен интерфейс командной строки докера, вы можете подключиться к этим общим ресурсам NFS с удаленного узла докера, используя один из следующих вариантов:
# create a reusable volume
$ docker volume create --driver local \
--opt type=nfs \
--opt o=addr=192.168.1.1,rw \
--opt device=:/path/to/dir \
foo
# or from the docker run command
$ docker run -it --rm \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/host/path \
foo
# or to create a service
$ docker service create \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/host/path \
foo
Вариант D: в режиме роя вы можете включать файлы в качестве конфигураций в свой образ. Это позволяет отправлять файлы конфигурации, которые обычно необходимо отправить на любой узел в рое, по запросу на узел, на котором работает ваша служба. Для его определения используется docker-compose.yml
файл, но режим swarm не использует сам docker-compose, поэтому он может не соответствовать вашим конкретным требованиям. Вы можете запустить кластер в режиме роя с одним узлом, поэтому эта опция доступна, даже если у вас только один узел. Эта опция требует, чтобы каждый из ваших файлов sql добавлялся как отдельная конфигурация. docker-compose.yml
будет выглядеть так:
version: '3.4'
configs:
sql_file_1:
file: ./file_1.sql
services
my-db-app:
image: my-db-app:latest
configs:
- source: sql_file_1
target: /sql/file_1.sql
mode: 444
Тогда вместо docker-compose up
вы запустите docker stack deploy -c docker-compose.yml my-db-stack
.
person
BMitch
schedule
08.09.2016
docker cp
будет работать, но не как часть docker-compose, это отдельный шаг. Было бы лучше не заключать docker-compose в сценарий оболочки только для этого. - person Andreas Wederbrand   schedule 08.09.2016