繁体   English   中英

无法在Docker中编译打字稿

[英]Cannot Compile the typescript in Docker

我想在node.js Web Server中使用typescript。 但是,Web Sever位于Docker容器中。 我使用Dockerfile就像打击一样:

FROM node:latest
COPY code/ /usr/local/lib
WORKDIR /usr/local/lib

RUN npm install -g koa@2
RUN npm install -g sequelize
RUN npm install -g mysql
RUN npm install -g typescript

CMD ["sh", "-c", "rm", "webApp.js"]
CMD ["sh", "-c", "tsc", "webApp.ts"]
CMD ["node", "webApp.js"]

在构建我的Docker之后,我发现在CMD命令之后没有生成webApp.js。 为什么,我该如何解决? 谢谢。

在创建Dockerfile时的最佳实践中,您应该只使用一个CMD和一个ENTRYPOINT

在你的情况下,它应该是:

COPY code/ /usr/local/lib
WORKDIR /usr/local/lib

RUN npm install -g koa@2
RUN npm install -g sequelize
RUN npm install -g mysql
RUN npm install -g typescript

RUN sh -c rm webApp.js
RUN sh -c tsc webApp.ts
CMD ["node", "webApp.js"]

好开始!

您可以在我的GitHub Docker / NodeJS / Typescript启动项目中查看我是如何实现这一目标的

正如另一个答案所指出的,您应该只使用一个CMD命令,因此您应该使用RUN sh -c tsc webApp.ts而不是使用该CMD。 这将使用您之前使用RUN npm install -g typescript typescript安装在容器上的tsc命令行工具来编译您的Typescript。

执行此操作并运行Dockerfile后,您可能希望在工作文件夹(托管Dockerfile的文件夹)中看到webApp.js ,但实际上您看不到它。 容器看到它,但你没有看到它。 这是怎么回事?

当您从Dockerfile运行这些命令时,实际上是在容器中运行它们,该容器位于机器的一个特殊的隐藏部分。 机器的隐蔽部分以及托管Dockerfile的机器部分是两个完全独立的地方。 因此,您将看不到生成的.js文件。

值得庆幸的是,Docker有一种在机器的这两个部分之间“安装”或镜像文件的方法。 这称为“音量”

卷上有一个很好的StackOverflow答案 卷语法在dockerfile中是这样的: ADD . /path/inside/docker/container ADD . /path/inside/docker/container 该命令的结构如下:ADD {my_filepath} {container_filepath}。 这意味着{my_filepath}上的计算机上的任何内容现在将被“挂载”或镜像到路径{container_filepath}的容器中。

ADD . . 将您当前的工作目录挂载到容器的主工作目录。

我认为问题是sh -c 当您在控制台中键入sh -c echo test ,将没有输出。 当您键入sh -c "echo test"或仅进行echo test时它将起作用。 那是因为只会执行第一个参数(看看man sh )。

但除此之外没有必要。 CMD ["rm", "webApp.js"]会做你想要的。 如果你希望它由bash / sh执行,你可以使用字符串语法CMD rm webApp.js

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM