Node.js docker RUN/CMD可能未执行
我正在尝试构建一个docker文件,在运行nodejs之前,首先在其中下载并安装云SQL代理Node.js docker RUN/CMD可能未执行,node.js,docker,Node.js,Docker,我正在尝试构建一个docker文件,在运行nodejs之前,首先在其中下载并安装云SQL代理 FROM node:13 WORKDIR /usr/src/app RUN wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy RUN chmod +x cloud_sql_proxy COPY . . RUN npm install EXPOSE 8000 RUN cloud_sql_pr
FROM node:13
WORKDIR /usr/src/app
RUN wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
RUN chmod +x cloud_sql_proxy
COPY . .
RUN npm install
EXPOSE 8000
RUN cloud_sql_proxy -instances=[project-id]:[region]:[instance-id]=tcp:5432 -credential_file=serviceaccount.json &
CMD node index.js
在构建docker文件时,我没有收到任何错误。此外,还包含并找到了文件serviceaccount.json
当运行docker文件并检查日志时,我看到我的nodejs应用程序中的连接被拒绝。因此,云SQL代理肯定有问题。此外,我在日志中没有看到任何云SQL代理的输出,只有来自nodejs应用程序的输出。当我创建一个VM并分别安装这两个包时,它就可以工作了。我得到的输出像“准备好连接”
因此,不知何故,我的docker文件是不正确的,因为云SQL代理没有安装或运行。我错过了什么
编辑:
我让它工作了,但我不确定这是正确的方法
这是我现在的dockerfile:
FROM node:13
WORKDIR /usr/src/app
COPY . .
RUN chmod +x wrapper.sh
RUN wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
RUN chmod +x cloud_sql_proxy
RUN npm install
EXPOSE 8000
CMD ./wrapper.sh
这是我的wrapper.sh文件:
#!/bin/bash
set -m
./cloud_sql_proxy -instances=phosphor-dev-265913:us-central1:dev-sql=tcp:5432 -credential_file=serviceaccount.json &
sleep 5
node index.js
fg %1
当我删除“sleep 5”时,它不起作用,因为在建立cloud\u sql\u代理连接之前服务器已经在运行。使用sleep 5,它可以工作
是否有其他/更好的方法等待第一个命令完全完成?
运行
命令用于执行更改映像文件系统的操作,如安装包等。它并不意味着在从生成的映像启动容器时运行进程,就像您尝试执行的那样。Dockerfile仅用于构建静态容器映像。运行此映像时,容器中只执行您为CMD
指令(node index.js
)提供的参数
如果需要在容器中同时运行cloud\u sql\u proxy
和node
,请将它们放入shell脚本中,并作为CMD
指令的一部分运行该shell脚本
看
理想情况下,每个进程都应该有一个单独的容器。我不确定
cloud\u sql\u proxy
做什么,但如果需要,您可能可以在自己的容器中运行它,并在自己的容器中运行节点
进程,并使用docker network
链接它们
您可以使用一个命令来管理、启动和停止这些多个容器。docker compose还负责自动设置容器之间的网络。您还可以声明您的
节点
应用程序依赖于云sql\u代理
容器,以便docker compose首先启动云sql\u代理
容器,然后启动节点
应用程序 多谢各位。我(差不多)有了。我已编辑了我的问题。您的节点应用程序必须能够适应其所依赖的服务不可用。如果cloud\u sql\u proxy
在node
应用程序启动之前没有出现,您的node应用程序应该重试。另外,请检查是否可以将这些流程分离到两个单独的容器中,并使用docker compose
。我理解,但这是用于google云项目的。我需要使用docker文件创建一个VM模板,如果需要,云将使用该模板动态创建新实例。我只能向模板添加一个图像,因此它应该包含所有内容。它应该是自我管理的。我不能使用wait(而不是sleep),因为cloud\u sql\u代理是一个持续运行的进程。如果有任何方法可以“捕获”响应(因为响应是“等待连接”),然后启动node index.js,我认为这应该是一种方法。