首页 > 解决方案 > Docker 容器在使用“sh -c”运行时退出

问题描述

我正在尝试从 docker 容器中运行网络服务器(现在仍在本地)。我目前正在逐步了解不同的部分。


Dockerfile:

FROM node:12.2.0-alpine as build
ENV environment development

WORKDIR /app
COPY . /app
RUN cd /app/client && yarn && yarn build
RUN cd /app/server && yarn 

EXPOSE 5000
CMD ["sh", "-c","NODE_ENV=${environment}", "node", "server/server.js"]

说明: 我有"sh", "-c"CMD 命令中的部分,因为没有它我收到此错误:

docker:来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:346:启动容器进程导致“exec:\”NODE_ENV=${environment}\“:$PATH 中找不到可执行文件”:未知。


构建容器:

构建容器可以正常工作:

docker build -t auth_example .

这需要一点时间,因为构建上下文(即使排除了所有 node_modules)大约是 37MB,但这没关系。


运行容器:

如果我这样做,运行容器和里面的应用程序就像一个魅力:

MyZSH: docker run -it -p 5000:5000 auth_example /bin/sh
/app # NODE_ENV=development node server/server.js

但是,当通过 CMD 命令运行容器时,如下所示:

MyZSH: docker run -p 5000:5000 auth_example

什么都没有发生,没有错误,什么都没有。日志是空的,并且 adocker ps -a显示容器在启动时已退出。我做了一些谷歌搜索并尝试了不同的组合,-t -i -d但这也没有解决它。

任何人都可以对此有所了解或指出我正确的方向吗?

标签: node.jsdocker

解决方案


问题是您要传递三个参数,sh -c而您通常会传递一个 ( sh -c "... ... ...")。

您可能根本不需要sh -c调用;使用/usr/bin/env给该环境变量取别名(或直接传入NODE_ENV而不是environment):

FROM node:12.2.0-alpine as build
ENV environment development

WORKDIR /app
COPY . /app
RUN cd /app/client && yarn && yarn build
RUN cd /app/server && yarn 

EXPOSE 5000
CMD /usr/bin/env NODE_ENV=${environment} node server/server.js

推荐阅读