У меня есть два файла 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




При развертывании на docker stack вы не должны использовать что-то вроде ниже
volumes:
- .:/data
Потому что docker потребуется, чтобы текущий путь к папке существовал на всех узлах, где создается контейнер. Также стек докеров не будет создавать папку, если она не существует. Это не похоже на docker-compose при локальном запуске на докере.
Поэтому вам нужно использовать путь, который существует на узле, где развертывается контейнер. Подробнее читайте ниже
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, если возможно, я хотел бы иметь версию, которая отлично работает локально, а также иметь другой файл, например docker-compose-deploy.yml, для развертывания
Именованный том один будет работать как локально, так и в стеке докеров роя.
@Taurun, я думаю, что мне тоже нужно изменить Dockerfile - но я не уверен, достаточно ли будет изменения на CMD ["/bin/sh","/newPath/app2/bootstrap.sh"] ?? Мне нужно как-то записать mount этот сценарий? Также мне нужно поменять все data на newPath в bootstrap.sh или что-то еще ?? Думаю, что вечером попробую ваше предложение.
Нет, вам не нужно ничего менять внутри dockerfile. Монтирование связано с тем, где сохраняются данные для изменений, сделанных внутри контейнера докеров. Так что вам не о чем беспокоиться. Все должно работать, если работает локально с именованными контейнерами
@Taurun, я сделал шаг вперед, но у меня странная проблема - я отредактировал свой пост в конце. Вы можете на это посмотреть?
Позвольте нам продолжить обсуждение в чате.
@Taurun, можешь ли ты привести пример, как это должно выглядеть? Я понимаю, что папки
dataне существует в стеке, но как я могу изменить свой файлdeployи другие файлы, чтобы они работали?