Почему docker-compose up не синхронизирует тома - PullRequest
1 голос
/ 11 апреля 2019

Вот упрощенная версия моего docker-compose.yml (это объем в buggy-service, который не ведет себя так, как я ожидаю):

version: '3.4'
services:

  local-db:
    image: postgres:9.6
    environment:
      - DB_NAME=${DB_NAME}
      # other env vars (not important)
    ports:
      - 5432:5432
    volumes:
      - ~/.docker-volumes/${DB_NAME}/postgresql/data:/var/lib/postgresql/data
      - postgresql:/docker-entrypoint-initdb.d

  buggy-service:
    build:
      context: .
      dockerfile: Dockerfile.test
      target: buggy-image
      args:
        # bunch of args (not important)
    volumes:
      - /Users/me/temp:/temp

volumes:

  postgresql:
    driver_opts:
      type: none
      device: /Users/me/postgresql
      o: bind

Если я сделаю docker-compose -f docker-compose.yml up -d local-db, контейнер для него запустится автоматически, и я обнаружу, что /Users/me/postgresql на хост-компьютере (Mac OSX) правильно связывается с /docker-entrypoint-initdb.d с синхронизацией содержимого.

Однако, если я сделаю docker-compose -f docker-compose.yml up --build -d buggy-service, контейнер не запустится автоматически.

Вопрос: Как заставить buggy-service вести себя как local-dbзапускать автоматически с установленным томом?

Вот урезанная версия Dockerfile.test, на которую ссылается buggy-service:

FROM microsoft/dotnet:2.1-sdk-alpine AS buggy-image

# Bunch of ARG definitions (not important)

VOLUME /temp

# other stuff (not important)

ENTRYPOINT ["/bin/bash"]

# Other FROMs

Редактировать 1

Немного больше информации о том, чего я пытаюсь достичь ...

Багги-контейнер I 'я пытаюсь заставить работать работает .Net Core в качестве базового образа.Его цель - запустить dotnet test и сгенерировать отчеты о покрытии, которые затем могут быть использованы на хосте, который может быть локальным разработчиком или сервером сборки (в данном случае, конвейерами BitBucket).

1 Ответ

0 голосов
/ 12 апреля 2019

... сопровождаемый docker run -dit --name buggy-container buggy-image

Эта команда создает новый контейнер, не основанный ни на чем в файле compose yml. Без указания тома он получит только анонимный том, поскольку вы определили объем в Dockerfile (я не рекомендую указывать там объем). Вы можете увидеть анонимные тома с помощью команды docker volume ls, это будут те, у кого длинный уникальный идентификатор и нет ссылок на то, к чему они принадлежат.

Чтобы определить том хоста из docker run, вам нужен флаг -v:

docker run -dit -v /Users/me/temp:/temp --name buggy-container buggy-image

Из вашего теперь измененного вопроса у вас есть новая проблема. Ваш контейнер указывает одну команду для запуска в точке входа:

ENTRYPOINT ["/bin/bash"]

Когда запускается bash, он читает ввод из стандартного ввода. Когда этот ввод заканчивается, например, когда вы запускаете контейнер без ввода, bash завершает работу. Когда процесс, выполняемый вашим контейнером, завершается, контейнер завершается. Из имеющихся подробностей я не могу сказать вам, какой должна быть эта команда, но хорошей отправной точкой будет посмотреть на другие образы в Docker-концентраторе, которые выполняют аналогичную задачу, которую вы пытаетесь запустить, и посмотреть на Dockerfile, который они использовать (многие образы-концентраторы указывают на репозиторий GitHub с полным исходным кодом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...