与其他 docker 容器通信 Cron 作业

问题描述 投票:0回答:1

我有一个 docker-compose 应用程序,如下所示:

networks:
  app-network:
      driver: bridge
      
services:
  schedulermicroservicejs:
    container_name: schedulermicroservicejs
    hostname: schedulermicroservicejs
    image: somoe-image
    ports:
        - "8087:8087"
    build:
      context: .
      dockerfile: SchedulerMicroserviceJS/Dockerfile
    depends_on:
        - activitiesmicroservice
    networks:
        - app-network
  cron:
    build: ./SchedulerMicroserviceJS/dockerized-cron
    networks:
        - app-network

我想知道是否可以将 cron 作业与调度程序微服务进行通信。 cron 作业是使用 ubuntu 映像完成的:

# Pulling Ubuntu image
FROM ubuntu:20.04

# Updating packages and installing cron
RUN apt-get update && apt-get install cron -y

# Installing node js
RUN apt-get install nodejs -y && apt-get install npm -y

# Creating directory for the script
RUN mkdir /script

# Setting script directory
WORKDIR /script

# Run npm init -y to create package.json
RUN npm init -y

# Install axios package
RUN npm install axios

# Create a file called script.js
RUN echo "const axios = require('axios');" >> script.js
RUN echo "const microserviceURL = 'http://schedulermicroservicejs:8087/api/scheduler';" >> script.js
RUN echo "axios.get(microserviceURL)" >> script.js
RUN echo "  .then(res => console.log('Schedule done successfully'))" >> script.js
RUN echo "  .catch(e => console.error(e));" >> script.js
RUN echo "console.log('Schedule done successfully');" >> script.js

# Copying script file into the container.
COPY date-script.sh .

# Giving executable permission to the script file.
RUN chmod +x date-script.sh

# Adding crontab to the appropiate location
ADD crontab /etc/cron.d/my-cron-file

# Giving executable permission to crontab file
RUN chmod 0644 /etc/cron.d/my-cron-file

# Running crontab
RUN crontab /etc/cron.d/my-cron-file

# Creating entry point for cron 
ENTRYPOINT ["cron", "-f"]

这是 crontab:

* * * * * root bash date-script.sh

这是 date-script.sh:

cd /script
#!/bin/sh
# It's Monday, so execute npm run scheduler
node script.js

由于安装了节点,因此需要加载太多内容,因此我想知道是否可以通过访问容器并在调度程序微服务中运行 npm 命令来与调度程序微服务进行通信,因为它已经在运行节点。但因为每个容器都运行自己的本地主机和虚拟机,所以我不能直接访问微服务。

node.js bash docker cron
1个回答
0
投票

这是可行的,但绝对很难,而且不是最好的方法。

据我了解,您的 cron 只向您的微服务发出

GET
请求。
curl
CLI 肯定会更轻、更容易使用,而不是运行需要 Node.js 的 Javascript 文件来完成此操作。此外,Dockerhub 上已经存在官方节点镜像,并预安装了节点。

但是为什么加载时间太长?图像的构建是的,但是一旦容器运行,只有 cron 运行,对吗?

此外,还有一些细微的改进:

  • 不要回显整个“script.js”文件,在您的主机上创建它并使用“COPY”
  • “WORKDIR”会在文件夹不存在时创建该文件夹,因此无需先运行“mkdir”。
© www.soinside.com 2019 - 2024. All rights reserved.