gpt4 book ai didi

docker - 在使用docker-compose启动webapp之前如何填充Elasticsearch数据库?

转载 作者:行者123 更新时间:2023-12-02 19:03:00 24 4
gpt4 key购买 nike

我正在尝试为使用Dockerfiledocker-compose.yml制作webappelasticsearch。我已将elasticsearch连接到webapp并将其公开给主机。但是,在运行Webapp之前,我需要创建elasticsearch索引并填充它们。我有2个脚本来执行此操作,data_scripts/createElasticIndex.jsdata_scripts/parseGenesToElastic.js。我试图用添加这些到Dockerfile

CMD [ "node", "data_scripts/createElasticIndex.js"]
CMD [ "node", "data_scripts/parseGenesToElastic.js"]
CMD ["npm", "start"]

但是运行 docker-compose up之后,没有索引。在运行Webapp之前如何填写 elasticsearch

Dockerfile :
FROM node:11.9.0

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY package*.json ./

# Install any needed packages specified in requirements.txt
RUN npm install
# If you are building your code for production
# RUN npm ci --only=production

#

RUN npm build
RUN npm i natives

# Bundle app source
COPY . .

# Make port 80 available to the world outside this container
EXPOSE 80

# Run app.py when the container launches
CMD [ "node", "data_scripts/createElasticIndex.js"]
CMD [ "node", "data_scripts/parseGenesToElastic.js"]
CMD [ "node", "servers/PredictionServer.js"]
CMD [ "node", "--max-old-space-size=8192", "servers/PWAServerInMem.js"]
CMD ["npm", "start"]

docker-compose.yml :
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: webapp
ports:
- "1337:1337"
- "4000:85"
depends_on:
- redis
- elasticsearch
networks:
- redis
- elasticsearch
volumes:
- "/data:/data"
environment:
- "discovery.zen.ping.unicast.hosts=elasticsearch"
- ELASTICSEARCH_URL=http://elasticsearch:9200"
- ELASTICSEARCH_HOST=elasticsearch
redis:
image: redis
networks:
- redis
ports:
- "6379:6379"
expose:
- "6379"
elasticsearch:
image: elasticsearch:2.4
ports:
- 9200:9200
- 9300:9300
expose:
- "9200"
- "9300"
networks:
- elasticsearch

networks:
redis:
driver: bridge
elasticsearch:
driver: bridge

最佳答案

Docker容器只能运行一个命令。当您的Dockerfile有多行CMD行时,只有最后一行有效,其余的行将被忽略。 (这里的ENTRYPOINT是提供单个命令的另一种方式;如果同时指定ENTRYPOINTCMD,则入口点将成为主进程,并且该命令将作为参数传递给它。)

给定您显示的示例,我将分三个步骤运行它:

  • 仅启动数据库
    docker-compose up -d elasticsearch
  • 运行“种子”作业。为了简单起见,我可能会在本地运行它们
    ELASTICSEARCH_URL=http://localhost:9200 node data_scripts/createElasticIndex.js

    (从直接在物理主机上运行的脚本的 Angular 使用物理主机的名称,以及从容器中发布的端口),但如果您愿意,还可以通过Docker设置运行它们
    docker-compose run web data_scripts/createElasticIndex.js
  • 建立数据库后,启动整个应用程序
    docker-compose up -d

    这将使运行中的Elasticsearch不受影响,并启动其他容器。

  • 如果您确定要在每个容器启动时都运行这些“种子”或迁移作业,那么另一种模式是编写一个入口点脚本。此处的基本模式是像现在一样通过 CMD启动服务器,但是编写一个脚本进行首次设置,以 exec "$@"结尾以运行命令,并使该容器成为 ENTRYPOINT。这看起来像

    #!/bin/sh
    # I am entrypoint.sh

    # Stop immediately if any of these scripts fail
    set -e

    # Run the migration/seed jobs
    node data_scripts/createElasticIndex.js
    node data_scripts/parseGenesToElastic.js

    # Run the CMD / `docker run ...` command
    exec "$@"

    # I am Dockerfile
    FROM node:11.9.0
    ...
    COPY entrypoint.sh ./ # if not already copied
    RUN chmod +x entrypoint.sh # if not already executable
    ENTRYPOINT ["/app/entrypoint.sh"]
    CMD ["npm", "start"]

    由于入口点脚本实际上只是一个shell脚本,因此您可以使用任意逻辑,例如仅基于命令 if [ "$1" == npm ]; then ... fi运行种子作业,而不能用于调试shell( docker run --rm -it myimage bash)。

    您的Dockerfile看起来也像您正在尝试启动三个不同的服务器( PredictionServer.jsPWAServerInMem.js和任何 npm start启动的服务器);您可以在同一张图片的三个单独的容器中运行这些文件,并在每个 command:块中指定 docker-compose.yml

    如果您删除 docker-compose.yml(除非您对Elasticsearch和Redis不能互相交谈;这通常不是这样)和 networks:声明(对您来说至关重要,这无济于事,特别是在存在 expose:的情况下,则您的 ports:会更简单) )。

    关于docker - 在使用docker-compose启动webapp之前如何填充Elasticsearch数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57234859/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com