无法在 Docker 中编译打字稿

Posted

技术标签:

【中文标题】无法在 Docker 中编译打字稿【英文标题】:Cannot Compile the typescript in Docker 【发布时间】:2016-11-11 19:45:15 【问题描述】:

我想在我的 node.js Web 服务器中使用 typescript。但是,Web 服务器位于 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。 为什么,我应该如何解决它?谢谢。

【问题讨论】:

【参考方案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"]

【讨论】:

谢谢,它对我有用。虽然我的 Dockers 之外的文件夹中仍然看不到 js 文件,但我认为原因是:缓存没有立即刷新。 在Container中生成js文件,所以保存在新创建的Container中。如果你想把它放在外面,你必须运行带有卷的容器。【参考方案2】:

伟大的开始!

您可以在我的 GitHub Docker/NodeJS/Typescript starter project 中查看我是如何完成此操作的

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

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

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

谢天谢地,Docker 有一种在机器的这两个部分之间“挂载”或镜像文件的方法。这称为"volume"。

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

很抱歉您的方法无效。这不是命令格式的问题,我不知道如何,但另一个答案对我有用。还是谢谢你的好意。 是的,Nguyen Sy Thanh Son 的回答是对的。 CMD 被其他人蒙蔽了

以上是关于无法在 Docker 中编译打字稿的主要内容,如果未能解决你的问题,请参考以下文章

使用 RollUp 捆绑打字稿 - 无法处理编译器选项

打字稿无法解析类型

SonarQube:找不到打字稿模块

Visual Studio Code:编译打字稿模块

通过webpack生产模式编译时如何忽略打字稿错误

使用打字稿表达无法查找视图目录