Java 如何将docker compose这样部署到web

Java 如何将docker compose这样部署到web,java,docker,deployment,docker-compose,dockerfile,Java,Docker,Deployment,Docker Compose,Dockerfile,我有两个war文件,我使用docker compose up命令在本地计算机上运行它们。我尝试使用docker machine教程部署它: 但是我在docker stack deploy-c docker-compose-deploy.yml app说:“bind”类型的装载配置无效:bind源路径不存在”后出错 我不知道如何处理它-我确信这个错误是由我的Dockerfiles中的CMD[“/bin/sh”,“/data/app/bootstrap.sh”]引起的。 我不想将它作为两个独立的wa

我有两个
war
文件,我使用
docker compose up
命令在本地计算机上运行它们。我尝试使用
docker machine
教程部署它: 但是我在docker stack deploy-c docker-compose-deploy.yml app说:
“bind”类型的装载配置无效:bind源路径不存在”后出错
我不知道如何处理它-我确信这个错误是由我的
Dockerfiles
中的
CMD[“/bin/sh”,“/data/app/bootstrap.sh”]
引起的。 我不想将它作为两个独立的
war
文件部署到tomcat

下面我给你我的项目部署的所有细节。我将用户名更改为
用户名

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
正在获取一个war文件,并将其放在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\u FILE=app2.WAR

第二个文件与expect
CMD[“/bin/sh”,“/data/app2/bootstrap.sh”]相同。

我的应用程序使用
docker compose up
命令运行良好

但我发现很难部署到docker云

编辑

当我运行
docker images-a
时,我有图像
username/dockerdocker\u app2:latest
username/dockerdocker\u app:latest
但在
docker stack deploy-c docker-compose-deploy.yml app
之后,版本为
命名卷容器

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应用程序--无trunc
命令给出错误:

No such image: username/dockerdocker_app:latest   

当部署到
docker stack
时,您不应该使用以下内容

volumes:
      - .:/data
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"
因为
docker
需要当前文件夹路径存在于容器实例化的所有节点上。此外,docker stack不会在文件夹不存在时创建该文件夹。这与在docker上本地运行时的docker compose不同

因此,您需要使用部署容器的节点上存在的路径。请阅读下面的内容以了解更多详细信息

type=bind:src是必需的,并指定要绑定装载的文件或目录的绝对路径(例如,src=/path/on/host/)如果文件或目录不存在,则会产生错误。

因此,您应该使用节点上已经存在的路径。所以你会使用下面的方法

volumes:
      - .:/data
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
文件夹

命名卷容器

或者,您可以使用swarm自动创建的命名卷容器(如果它不存在)

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:

@陶伦你能举例说明它应该是什么样子吗?我知道堆栈上不存在
数据
文件夹-但如何更改
部署
文件和其他文件以使其工作?是,我正在更新更多的答案details@Taurun如果可能的话,我希望有一个在本地运行良好的版本,并有其他文件,如问题中的
docker compose deploy.yml
来部署指定的卷1将在本地和swarm docker堆栈上工作well@Taurun我认为我也必须改变Dockerfile——但我;我不确定更改为
CMD[“/bin/sh”、“/newPath/app2/bootstrap.sh”]
是否足够??我是否必须以某种方式装载该脚本?此外,我还必须在
bootstrap.sh
中将所有
数据
更改为
newPath
,或其他内容??我想我会在晚上试试你的建议。