如何将这样的docker-compose部署到web

时间:2018-03-25 11:12:44

标签: java docker deployment docker-compose dockerfile

我有两个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的{​​{1}}引起的。 我不想将它作为两个单独的war文件部署到tomcat。

Bellow我向您提供有关部署的项目的所有详细信息。我将用户名更改为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行。

我还有两个文件夹: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 images -a

之后我又跑了docker stack ps app --no-trunc我看不到任何形象 - 很奇怪?

No such image: username/dockerdocker_app:latest 命令给我错误:

kotlin.test

1 个答案:

答案 0 :(得分:3)

部署到docker stack时,不应使用下面的内容

volumes:
      - .:/data

因为docker需要当前文件夹路径存在于容器实例化的所有节点上。当docker堆栈不存在时,它也不会创建该文件夹。在docker上本地运行时,这与docker-compose不同。

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

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

  

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

因此,您应该使用节点上已存在的路径。所以你会使用类似下面的东西

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: