开发人员是否应该能够在其开发环境中从lerna monorepo创建docker工件?

时间:2019-05-24 07:20:44

标签: microservices docker devops monorepo

我最近开始使用lerna来管理monorepo,并且在开发中效果很好。

Lerna在我的各种软件包之间创建符号链接,因此'tsc --watch'或nodemon之类的工具可以很好地检测其他软件包中的更改。

但是在这种环境下创建docker镜像时遇到了问题。

假设我们有一个具有以下结构的项目:

x[1] = 1

在这种情况下,在开发中,一切都很好。我正在运行某种实时重新加载服务器,符号链接可以正常运行,从而使依赖项正常工作。

现在让我们说我想从后端创建一个docker映像。

我将介绍一些情况:

  1. 我在我的Dockerfile中N[i,j] = N[j,i] package.json,然后运行npm install。

    不起作用,因为通用和实用程序包未发布。

  2. 我在后端运行我的构建命令,在docker文件中添加/ build和/ node_modules。

    不起作用,因为我构建的后端具有root packages common → artifact is a private npm package, this depends on utilities, something-specific utilities → artifact is a public npm package something-specific -> artifact is a public npm package frontend → artifact is a docker image, depends on common backend → artifact is a docker image, depends on common and utilities ADD命令,这些命令位于node_modules(符号链接)中,但是Docker只会忽略这些符号链接的文件夹。

    解决方法::使用require('common')“取消符号链接”节点模块有效。参见此AskUbuntu question

  3. 步骤1,但在构建docker映像之前,我先发布了npm软件包。

    这行得通,但是对于正在检查代码库并对require('utilities')cp --dereference进行修改的人来说,它没有用,因为他们没有发布权限npm软件包。

  4. 我将common的{​​{1}}命令配置为不将utilitiesbuild视为外部,而将backend配置为不将{{ 1}}作为外部对象。

    我认为先构建common,然后构建utilities,再构建common,再构建something-specific

    这样,当进行构建时,并将此技术与webpack一起使用时,捆绑软件将包含something-specific,common和common中的所有代码。

    但这很麻烦。

我要在这里解决似乎很简单的问题。我的机器上当前正在运行的代码,我想拉出并放入docker容器中。

记住我们要在这里实现的关键是,使某人能够从他们的开发环境中检出代码库,修改任何软件包,然后构建docker映像。

在这里我是否缺少明显的lerna技术,或者我可以用来思考解决此问题的devops参考框架?

1 个答案:

答案 0 :(得分:1)

我们遇到了类似的问题,这是我们所做的事情:将Dockerfile放在monorepo的根目录(lerna.json所在的位置)中。

原因:您确实将整个存储库视为真实的单一来源,并且您希望对整个存储库的任何修改都反映在Docker映像中,因此为各个软件包使用单独的Dockerfile显得没有意义。 / p>

Dockerfile

True

package.json

FROM node:12.13.0

SHELL ["/bin/bash", "-c"]

RUN mkdir -p /app
WORKDIR /app

# Install app dependencies
COPY package.json /app/package.json
COPY yarn.lock /app/yarn.lock
COPY packages/frontend/package.json /app/packages/frontend/package.json
COPY packages/backend/package.json /app/packages/backend/package.json
COPY lerna.json /app/lerna.json
RUN ["/bin/bash", "-c", "yarn install"]

# Bundle app source
COPY . /app
RUN ["/bin/bash", "-c", "yarn bootstrap"]
RUN ["/bin/bash", "-c", "yarn build"]

EXPOSE 3000

CMD [ "yarn", "start" ]