如何修复Docker意外操作员错误?

时间:2019-06-25 05:18:45

标签: node.js docker google-cloud-run

我是Docker的超级新手,最近将项目从App Engine迁移到Cloud Run。很轻松,喜欢它。

但是,现在,我正在尝试更新图像(因为我添加了一些新代码)。我知道我需要进入一个实际的容器来更新图像(我认为吗?),但是当我尝试docker run时,会出现unexpected operator错误。

这绝对让我发狂。

我无法启动容器。我无法编辑图像。我无法在Cloud Run上上传新版本。

据我所知,unexpected operator错误必须处理Dockerfile。因此,这是我的Dockerfile(由Google提供,用于在Cloud Run上部署映像)。

Dockerfile

#Use the official Node.js 10 image
#https://hub.docker.com/_/node
FROM node:10

#Create and change to the app directory
WORKDIR /usr/src/app

#Copy application dependency manifests to the container image.
#A wild card is used to ensure both package.json AND package-lock.json are copied.
#Copying this separately prevents re0running npm install on every code change.
COPY *package.json ./

#Install production dependences
RUN npm install --only=production

#COPY local code to the container image
COPY . .

#Run the web service on container startup
CMD [ "npm", "start" ]

我遇到的具体unexpected operator错误是/bin/sh: 1: [: npm.: unexpected operator

老实说,我现在不知道该怎么办。我想我需要再看一眼。

2 个答案:

答案 0 :(得分:2)

每次更改后,您都必须从Dockerfile重建映像

var additionalInformation=   response.AdditionalInformation.Select( async x =>  new AdditionalInformationItem
                {
                    StatementCode = x?.StatementCode?.Value,
                    LimitDateTime = x?.LimitDateTime?.Item?.Value,
                    StatementTypeCode = x?.StatementTypeCode?.Value,
                    StatementDescription = x?.StatementDescription?.Value,
                    AdditionalInformationResult = await BuildAdditionalInformationPointers(x)


                });

await Task.WhenAll(additionalInformation);
//This will iterate the results so may not be the most efficient method if you have a lot of results
List<AdditionalInformationItem> unwrapped = additionalInformation.Select(s => s.Result).ToList();

答案 1 :(得分:2)

我敢打赌,当您给代码片段CMD [ "npm", "start" ]时,有意或无意地清理了代码,几乎可以肯定CMD [ "npm" "start" ] 最初构建映像并尝试将其作为容器运行时。

打破错误消息:/bin/sh: 1: [: npm.: unexpected operator

它告诉您Shell脚本在第一行出现问题。哪个shell脚本?由CMD行触发的shell脚本。第1行是因为在CMD运行的情况下,这是唯一的一行。

然后它很模糊地说,它在npm语句之后出现问题。导致意外的最简单方法是忘记逗号。

鉴于您显然能够在以后使事情运行,很可能是您:

  • 使用缺少的逗号从Dockerfile构建映像
  • 尝试将图像作为容器运行,由于构建的图像中的CMD损坏,因此无法正常工作
  • 修复了错误
  • 尝试将仍然破碎的图像作为容器运行,并且由于使用相同的图像而仍然无法正常工作
  • 将代码发布到这里,现在已修复,但由于您仍在运行旧图像而似乎不起作用
  • 这里提供了包括重建在内的建议
  • 从Dockerfile重建新映像,并选择固定的逗号
  • 将新图像作为容器运行,一切似乎都神奇地修复了