Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js docker RUN/CMD可能未执行_Node.js_Docker - Fatal编程技术网

Node.js docker RUN/CMD可能未执行

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

我正在尝试构建一个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_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,我认为这应该是一种方法。