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