node.js - 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
但这也没有解决它。
任何人都可以对此有所了解或指出我正确的方向吗?
解决方案
问题是您要传递三个参数,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
推荐阅读
- android - 仅创建一次时,如何将 RxJava Flowable 与函数一起使用
- python - 如何在odoo中的many2one字段中显示字符'-'之后的文本
- python - 在 tableau 中创建从现有数据源中派生的新列
- react-native - 在 react-native-reanimated 2.0 中访问 SharedValue 的性能问题
- javascript - v-bind:class 和 cookie 的意外行为(Vue js)
- android - 如何通过单击我的应用程序中的按钮来访问管理键盘和设置键盘布局
- angular - IONIC DEEPLINKS BUGS:无法重定向到深度链接
- javascript - 如何使用 ResizeObserver 检测窗口调整大小事件
- javascript - Node.js 中的 Jest 模拟事件发射器 vanilla JS
- python - Python解释器中的海象运算符