无法在Docker中编译打字稿

时间:2016-07-09 09:13:13

标签: node.js docker typescript dockerfile

我想在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。 为什么,我该如何解决?感谢。

3 个答案:

答案 0 :(得分:1)

在创建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"]

答案 1 :(得分:1)

好开始!

您可以在我的GitHub Docker/NodeJS/Typescript starter project

中查看我是如何做到这一点的

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

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

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

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

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

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

答案 2 :(得分:0)

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

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