有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将dockercompose部署到web

我有两个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"后出错了 我不确定如何处理它——我确信这个错误是由我的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

我还有两个文件夹:appapp2

app文件夹中,我有: app.warapp2.warbootstrap.shDockerfile

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.shDockerfile

第一个文件仅在这一行中有所不同: 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 stack ps app --no-trunc命令给出错误:

No such image: username/dockerdocker_app:latest   

共 (1) 个答案

  1. # 1 楼答案

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

    volumes:
          - .:/data
    

    因为docker需要当前文件夹路径才能存在于容器实例化的所有节点上。此外,docker stack不会在文件夹不存在时创建该文件夹。这与在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文件夹

    命名卷容器

    或者,您可以使用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: