Как развернуть docker-compose в Интернете

У меня есть два файла war, и я нормально запускаю их на своем локальном компьютере с помощью команды docker-compose up. Я попытался развернуть его с помощью учебника docker-machine: https://docs.docker.com/get-started/part4/ но я получил сообщение об ошибке после того, как docker stack deploy -c docker-compose-deploy.yml app сказал: "invalid mount config for type "bind": bind source path does not exist" Я не уверен, как с этим справиться - и я почти уверен, что эта ошибка вызвана CMD ["/bin/sh","/data/app/bootstrap.sh"] из моего Dockerfiles. Я не хочу развертывать его как два отдельных файла war для tomcat.

Ниже я расскажу вам все подробности моего проекта относительно развертывания. Я изменил свое имя пользователя на username:

docker-compose-deploy.yml

version: "3"
services:
  app2:
    image: userName/dockerdocker_app2
    container_name: app2
    build:
      context: ./app2
    volumes:
      - .:/data
    environment:
      - LOGGING_LOG-FILES-PATH=/opt/tomcat/logs
    ports:
      - "8000:8080"
  app:
    image: userName/dockerdocker_app
    container_name: app
    build:
      context: ./app
    volumes:
      - .:/data
    environment:
      - LOGGING_LOG-FILES-PATH=/opt/tomcat/logs
    ports:
      - "8001:8080"

У моего docker-compose.yml нет линий image.

Также у меня есть две папки: app и app2

в папке app у меня есть: app.war, app2.war, bootstrap.sh, Dockerfile

bootstrap.sh берет один из файлов войны и помещает его в Tomcat

#!/bin/bash

WAR_FILE=app.war

cp /data/util/wait-for.sh /
chmod +x /wait-for.sh

echo "Starting application..."
rm -rf /opt/tomcat/webapps/*
ln -s /data/app/$WAR_FILE /opt/tomcat/webapps/ROOT.war
rm -rf /opt/tomcat/logs
ln -s /data/logs/app /opt/tomcat

echo "Starting Tomcat..."

echo "org.apache.catalina.webresources.Cache.level = SEVERE" >> /opt/tomcat/conf/logging.properties
export JAVA_OPTS = "$JAVA_OPTS -Duser.language=pl -Djava.security.egd=file:/dev/./urandom -D"

${CATALINA_HOME}/bin/catalina.sh run

Dockerfile:

FROM jeanblanchard/tomcat:8

ENV authType ""
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

CMD ["/bin/sh","/data/app/bootstrap.sh"]

в папке app2 у меня есть: bootstrap.sh, Dockerfile

Первый файл отличается только этой строкой: WAR_FILE=app2.war

Второй файл такой же ожидаем CMD ["/bin/sh","/data/app2/bootstrap.sh"]

Мое приложение отлично работает с командой docker-compose up.

Но мне сложно развернуть, например, в docker-cloud.

РЕДАКТИРОВАТЬ

Когда я запускаю docker images -a, у меня появляются образы username/dockerdocker_app2:latest и username/dockerdocker_app:latest, но после docker stack deploy -c docker-compose-deploy.yml app с версией Named volume containers вы предложили мне получить

Updating service app_app (id: pn6ofp4vocs0fy6j6f67dc8wr)
image username/dockerdocker_app:latest could not be accessed on a registry to record
its digest. Each node will access username/dockerdocker_app:latest independently,
possibly leading to different nodes running different
versions of the image.

И после этого, когда я снова запускаю docker images -a, я не вижу никакого изображения - странно?

Команда docker stack ps app --no-trunc выдает ошибку:

No such image: username/dockerdocker_app:latest   
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
578
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При развертывании на docker stack вы не должны использовать что-то вроде ниже

volumes:
      - .:/data

Потому что docker потребуется, чтобы текущий путь к папке существовал на всех узлах, где создается контейнер. Также стек докеров не будет создавать папку, если она не существует. Это не похоже на docker-compose при локальном запуске на докере.

Поэтому вам нужно использовать путь, который существует на узле, где развертывается контейнер. Подробнее читайте ниже

https://docs.docker.com/engine/reference/commandline/service_create/#add-bind-mounts-volumes-or-memory-filesystems

type=bind: src is required, and specifies an absolute path to the file or directory to bind-mount (for example, src=/path/on/host/). An error is produced if the file or directory does not exist.

Таким образом, вы должны использовать либо путь, который уже существует на ваших узлах. Итак, вы должны использовать что-то вроде ниже

version: "3"
services:
  app2:
    image: userName/dockerdocker_app2
    container_name: app2
    build:
      context: ./app2
    volumes:
      - /opt/data:/data
    environment:
      - LOGGING_LOG-FILES-PATH=/opt/tomcat/logs
    ports:
      - "8000:8080"
  app:
    image: userName/dockerdocker_app
    container_name: app
    build:
      context: ./app
    volumes:
      - /opt/data:/data
    environment:
      - LOGGING_LOG-FILES-PATH=/opt/tomcat/logs
    ports:
      - "8001:8080"

И убедитесь, что на каждом узле уже есть папка /opt/data.

Именованные контейнеры томов

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

version: "3"
services:
  app2:
    image: userName/dockerdocker_app2
    container_name: app2
    build:
      context: ./app2
    volumes:
      - app2data:/data
    environment:
      - LOGGING_LOG-FILES-PATH=/opt/tomcat/logs
    ports:
      - "8000:8080"
  app:
    image: userName/dockerdocker_app
    container_name: app
    build:
      context: ./app
    volumes:
      - app1data:/data
    environment:
      - LOGGING_LOG-FILES-PATH=/opt/tomcat/logs
    ports:
      - "8001:8080"
volumes:
  app1data:
  app2data:

@Taurun, можешь ли ты привести пример, как это должно выглядеть? Я понимаю, что папки data не существует в стеке, но как я могу изменить свой файл deploy и другие файлы, чтобы они работали?

tryingHard 28.03.2018 16:38

Да, я дополняю ответ более подробной информацией

Tarun Lalwani 28.03.2018 16:39

@Taurun, если возможно, я хотел бы иметь версию, которая отлично работает локально, а также иметь другой файл, например docker-compose-deploy.yml, для развертывания

tryingHard 28.03.2018 16:43

Именованный том один будет работать как локально, так и в стеке докеров роя.

Tarun Lalwani 28.03.2018 16:46

@Taurun, я думаю, что мне тоже нужно изменить Dockerfile - но я не уверен, достаточно ли будет изменения на CMD ["/bin/sh","/newPath/app2/bootstrap.sh"] ?? Мне нужно как-то записать mount этот сценарий? Также мне нужно поменять все data на newPath в bootstrap.sh или что-то еще ?? Думаю, что вечером попробую ваше предложение.

tryingHard 28.03.2018 16:48

Нет, вам не нужно ничего менять внутри dockerfile. Монтирование связано с тем, где сохраняются данные для изменений, сделанных внутри контейнера докеров. Так что вам не о чем беспокоиться. Все должно работать, если работает локально с именованными контейнерами

Tarun Lalwani 28.03.2018 16:52

@Taurun, я сделал шаг вперед, но у меня странная проблема - я отредактировал свой пост в конце. Вы можете на это посмотреть?

tryingHard 28.03.2018 17:14

Позвольте нам продолжить обсуждение в чате.

Tarun Lalwani 28.03.2018 17:15

Другие вопросы по теме