首页 > 解决方案 > 如何在 Docker 卷上将 typescript 转换为 javascript?

问题描述

我有一个 Typescript 节点应用程序。主文件是server.ts. 我想在 Docker 容器中运行这个应用程序。我有一个Dockerfile运行 Typescript 转译的构建步骤,例如:

FROM node:9.9 as build

WORKDIR /app

COPY package*.json ./
COPY ... # copy the source files to the docker container 

RUN npm install && \
npm run build  # <-- runs Typescript transpile

FROM node:9.9

COPY --from=build /path/to/source/files /app

WORKDIR /path/to/server.js directory

CMD ["node", "server.js"]

docker-compose用来配置容器进行开发

my-app:
  build:
    context: /path/to/build/context
    dockerfile: Dockerfile
  command: bash -c "npm install -g nodemon && nodemon server.js"
  network_mode: "host"
  volumes:
    - /path/to/server.js/directory/local:/path/to/server.js/directory/in/container

由于 Typescript 在图像构建阶段被转译,因此server.js文件是在容器中创建的。因此,如果我在docker-compose没有包含卷的情况下运行,则server.js文件在那里并且容器可以正常启动。如果我docker-compose使用卷运行,则server.js文件不存在,只是server.ts. 我认为这是因为在本地,我没有,server.js因为它是在映像构建阶段构建的,并且由于卷正在引用该目录,所以它不在容器中。有什么方法可以构建容器并将js构建阶段的转译文件放在该卷中?

标签: typescriptdockerdocker-compose

解决方案


一个想法是在构建映像期间将已转换的文件复制到不同的文件夹中,并/path/to/server.js/directory/in/container在开始之前将它们链接到目录node。docker-compose 中的内容command类似于:

command: bash -c "ln -s /path/to/built/files /path/to/server.js/directory/in/container; npm install ..."

推荐阅读