使用Yarn依赖构建Node应用的Docker镜像

9

我正在尝试为使用yarn安装依赖项的node应用程序构建docker镜像。我的Dockerfile如下:

 FROM node:7
WORKDIR /app
COPY package.json /app
RUN yarn install
COPY . /app
CMD npm run develop
EXPOSE 8000

当我在本地机器上运行yarn install时,一切都正常,但是当我进行docker构建时,我会遇到这个错误导致程序一直阻塞。

**docker build -t  rs  .**
Sending build context to Docker daemon  219.1MB
Step 1/7 : FROM node:7
 ---> d9aed20b68a4
Step 2/7 : WORKDIR /reason
 ---> Using cache
 ---> fe51a1860989
Step 3/7 : COPY package.json /reason
 ---> Using cache
 ---> b0e136ee6eeb
Step 4/7 : RUN yarn install
 ---> Running in e273f8cf1f3e
yarn install v0.24.4
info No lockfile found.
[1/4] Resolving packages...
Couldn't find any versions for "glamor" that matches "next"
? Please choose a version of "glamor" from this list: (Use arrow keys)
❯ 2.20.40
  2.20.39
  2.20.38
  2.20.37
  2.20.36
  2.20.35
  2.20.34
(Move up and down to reveal more choices)warning glamor@3.0.0-3: abandoned, please use v2 instead
warning gatsby-plugin-glamor > glamor-inline@1.0.5: use glamor/inline instead
warning gatsby-plugin-glamor > glamor-react > glamor@3.0.0-3: abandoned, please use v2 instead
warning gatsby-plugin-glamor > glamor-server > glamor@3.0.0-3: abandoned, please use v2 instead
warning gatsby > babel-preset-es2015@6.24.1:   Thanks for using Babel: we recommend using babel-preset-env now: 

请阅读 babeljs.io/env 进行更新!

控制台一直停留在这个阶段,我该如何修复?


这似乎更像是您使用的软件包出现了问题。尝试在没有Docker的情况下进行安装。只需在计算机上进行常规安装(npm install),然后观察发生了什么。在npmjs.org上查找特定模块(以及版本号)。 - JBone
你是如何在没有使用Docker的情况下运行你的应用程序的?如果是这样,请将你的CMD命令更改为 "CMD ["npm", "run", "develop"]"。 - Jinna Balu
3个回答

11

在构建镜像之前,您应该先运行yarn install生成一个yarn lockfile (yarn.lock)。然后确保将它与package.json一起复制。您的dockerfile应该如下所示:

FROM node:7 
WORKDIR /app 
COPY package.json /app 
COPY yarn.lock /app
RUN yarn install 
COPY . /app 
CMD npm run develop 
EXPOSE 8000

使用此方法,当构建您的镜像时,所有依赖项都应成功安装。


谢谢你的帮助。现在镜像已经成功构建,但是我无法运行它。当我执行 docker run 时,它显示我的站点正在 localhost:8000 上运行,但当我去浏览器时,没有任何东西出现。它说 Safari 无法连接到服务器,而当我用 npm run develop 正常运行时,一切都正常,并且我可以看到我的站点。这里可能有什么问题? - Kendo Nguimi
1
你需要确保两件事情。1)你正在使用例如docker run -p 8000:8000 myimage的方式暴露8000端口。2)开发服务器运行在0.0.0.0而不是localhost上,只是为了确保它能按预期工作。 - Clive Makamara
为了减小图像大小,使用Alpine,您需要清理Yar。请检查我的答案。 - Jinna Balu

8

Dockerfile

FROM node:6.9.5-alpine
RUN mkdir -p /code
WORKDIR /code
ADD . /code
RUN npm install -g -s --no-progress yarn && \
    yarn && \
    yarn run build && \
    yarn cache clean
CMD [ "npm", "start" ]
EXPOSE 8080

docker-compose.yml

version: '2'
services:
  sample-app:
    image: sample-node-yarn-app
    ports:
      - "8080:8080"

创建Docker镜像
docker build -t sample-node-app .

RUN

docker-compose up -d

单个镜像为什么需要Docker Compose? - Clive Makamara
2
我认为这不会是一个大问题,为了简化我们的工作,运行命令被简化为 "docker-compose up" 和 "docker-compose down"。 - Jinna Balu

1
你可以使用预定义的 yarn docker 镜像来简化上述答案。在此,我们假设该镜像仅用于开发目的。对于生产模式,您应该只考虑最少的二进制文件,例如 node。
FROM gmolaire/yarn:1.22.4_12.18.3-alpine3.12

WORKDIR /usr/local/app
ADD . .

RUN yarn install && \
    yarn build

EXPOSE 8080

CMD [ "yarn", "run", "develop" ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接