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

Posted

技术标签:

【中文标题】如何修复 Docker 意外操作员错误?【英文标题】:How to fix Docker Unexpected Operator Error? 【发布时间】:2019-11-06 21:23:23 【问题描述】:

我是 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

老实说,我现在不知道该怎么办。我想我需要第二双眼睛才能仔细查看。

【问题讨论】:

如果你运行docker run container_name npm --version会发生什么? 我收到6.9.0 作为回复 那么您的 npm 安装工作正常...请运行此docker run container_name npm start 运行也很好。我收到了我应该收到的App listening to pop 8080 回复 你必须通过运行docker build --tag="nmp_app:latest" -f Dockerfile .来重建Docker文件 【参考方案1】:

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

分解错误信息:/bin/sh: 1: [: npm.: unexpected operator

它告诉你 shell 脚本在第一行有问题。哪个shell脚本?由 CMD 行触发的 shell 脚本。第 1 行部分是因为,在 CMD 运行的上下文中,这是唯一的一行。

然后它在 npm 语句之后非常难以辨认地说它有问题。不小心造成这种情况的最简单方法是忘记逗号。

鉴于您显然能够稍后运行,您很可能:

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

【讨论】:

【参考方案2】:

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

docker build --tag="npm_app:latest" -f Dockerfile .
docker run npm_app 

【讨论】:

以上是关于如何修复 Docker 意外操作员错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复意外令牌“/”的 ESLint 解析错误?

如何修复 babel 意外的保留字“接口”错误

错误:MySQL 意外关闭。 XAMPP,如何修复损坏的表

如何修复节点中的“解析错误:意外的令牌 =>”?

如何修复:“致命错误:在展开可选值 (lldb) 时意外发现 nil”

如何修复“线程 1:致命错误:在展开可选值时意外发现 nil”错误? [复制]