Подтвердить что ты не робот

Добавление файлов в стандартные изображения с помощью docker-compose

Я не уверен, что что-то очевидное ускользает от меня, или если это просто невозможно, но я пытаюсь составить весь стек приложения с изображениями из узла докеров.

Один из них - mysql и поддерживает добавление пользовательских файлов конфигурации через тома и запуск .sql файлов из смонтированного каталога.

Но у меня есть эти файлы на машине, где я запускаю docker-compose, а не на хосте. Невозможно ли указать файлы с локального компьютера для копирования в контейнер, прежде чем он запустит его entrypoint/cmd? Мне действительно нужно создавать локальные образы всего лишь для этого случая?

4b9b3361

Ответ 1

Вариант A: Включите файлы внутри вашего изображения. Это не так идеально, поскольку вы смешиваете файлы конфигурации с вашим изображением (на самом деле это должно содержать только ваши двоичные файлы, а не вашу конфигурацию), но удовлетворяет требованию использовать только файлы для док-станции для отправки файлов.

Эта опция достигается с помощью компоновки 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.


Вариант B: Используйте том для хранения ваших данных. Это невозможно сделать непосредственно внутри сокета-докера. Однако это предпочтительный способ включения файлов извне изображения в контейнер. Вы можете заполнить том по сети, используя CLI докеры и перенаправление ввода вместе с командой, например tar, чтобы упаковать и распаковать эти файлы, отправляемые по stdin:

tar -cC sql . | docker run --rm -it -v sql-files:/sql \
  busybox /bin/sh -c "tar -xC /sql"

Запустите это с помощью script, а затем запустите тот же самый script, чтобы перезагрузить эту конфигурацию.


Вариант C: Используйте какую-то сетевую файловую систему. Если вы можете настроить NFS на хост, на котором выполняется ваш CLI доклер, вы можете подключиться к этим общим ресурсам NFS из удаленного докере node, используя одну из следующих опций:

# 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:. С режимом роя вы можете включать файлы в качестве конфигов в свой образ. Это позволяет конфигурационным файлам, которые обычно нужно нажимать на любой node в рое, для отправки по запросу node, где работает ваша служба. Для определения этого используется файл docker-compose.yml, но режим рой не использует сам файл docker-compose, поэтому это может не соответствовать вашим конкретным требованиям. Вы можете запустить одиночный кластер режимов swarm node, поэтому этот параметр доступен, даже если у вас есть только один node. Этот параметр требует, чтобы каждый из ваших файлов 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.

Ответ 2

Вот как я делаю это с томами:

services:
  my-db-app:
    command: /shell_scripts/go.sh
    volumes:
      - ./shell_scripts:/shell_scripts 

Ответ 3

Моя репутация слишком низкая, чтобы прокомментировать, поэтому я создаю новый ответ, Адам Спенс отвечает, что "-" для опции томов "вызывает тома" должен быть массивом, как внизу:

services:
  my-db-app:
    command: /shell_scripts/go.sh
    volumes:
      - ./shell_scripts:/shell_scripts 

Ответ 4

В качестве более позднего обновления к этому вопросу: например, с помощью докерного роя, размещенного на Amazon, вы можете определить том, который может использоваться службами и доступен для всех узлов роя (используя cloudstor, который, в свою очередь, имеет AWS EFS, лежащий в основе для сохранения).

version: '3.3'
services:
  my-db-app:
    command: /shell_scripts/go.sh
    volumes:
      shell_scripts:/shell_scripts 
volumes:
    shell_scripts:
      driver: "cloudstor:aws"

Ответ 5

я думаю, что вы должны были сделать в файл для создания:

volumes:
 - src/file:dest/path

Ответ 6

Если вы не можете использовать тома (требуется docker-compose.yml без состояния и удаленный компьютер), вы можете записать конфигурационный файл по команде.

Пример для конфигурации nginx в официальном образе:

version: "3.7"

services:
  nginx:
    image: nginx:alpine
    ports:
      - 80:80
    environment:
      NGINX_CONFIG: |
        server {
          server_name "~^www\.(.*)$$" ;
          return 301 $$scheme://$$1$$request_uri ;
        }
        server {
          server_name example.com
          ...
        }
    command:
      /bin/sh -c "echo $$NGINX_CONFIG > /etc/nginx/conf.d/redir.conf; nginx -g \"daemon off;\""

Переменная среды также может быть сохранена в файле .env, вы можете использовать функцию расширения Compose или загрузить ее из среды оболочки (откуда вы ее взяли из любого другого места):

https://docs.docker.com/compose/compose-file/#env_file https://docs.docker.com/compose/compose-file/#variable-substitution