【问题标题】:Can I make docker an environment without saving code我可以在不保存代码的情况下使 docker 成为环境吗
【发布时间】:2019-05-16 09:23:54
【问题描述】:

我是 docker 新手,我想知道,我可以将 docker 仅用作应用程序环境吗?

我有Dockerfile,它可以让我构建一个 Docker 映像,并让其他队友和服务器能够运行我的项目。

FROM node:10.15.3
ADD . /app/
WORKDIR /app
RUN npm install
RUN npm run build
ENV HOST 0.0.0.0
ENV PORT 3000
EXPOSE 3000
CMD ["npm", "run","start"]

项目可以构建和运行。一切都很完美。

但是,我发现所有文件都会被压缩到图像文件中。我的源代码和所有 node_modules。它使文件太大。

我记得在我之前的项目中,我将创建 Linux VM 并将我的项目文件夹绑定到来宾操作系统。然后我可以继续开发和使用虚拟机作为服务器。

docker 可以做这样的事情吗? docker只需要加载我的项目文件夹(运行命令时会传递路径)。

然后它运行npm installnpm start/dev。所有库都将保存到我的本地目录中。或者我手动运行 npm start 然后 docker 加载我的文件和主机。

我只需要 docker 作为我的应用程序服务器,以确保我可以获得与部署到生产服务器相同的结果。

Docker 可以做到这一点吗?

===============================更新================ ================

我尝试使用绑定挂载来执行此操作。 然后我创建 docker-compose

version: "3.7"
services:
  web:
    build: .
    volumes:
      -  type: bind
         source: C:\myNodeProject
         target: /src/
    ports:
      - '8888:3000'

我更新了 dockerfile

FROM node:10.15.3

# Install dependencies
WORKDIR /src/


# I ran 'CMD ls' then confirm that the directory is blinded 

# Expose the app port
EXPOSE 3000

# Start the app
CMD  yarn dev

我得到了错误

web_1  | yarn run v1.13.0
web_1  | $ cross-env NODE_ENV=development nodemon server/index.js --watch server
web_1  | [nodemon] 1.18.11
web_1  | [nodemon] to restart at any time, enter `rs`
web_1  | [nodemon] watching: /src/server/**/*
web_1  | [nodemon] starting `node server/index.js`
web_1  | [nodemon] app crashed - waiting for file changes before starting...

index.js

const express = require('express')
const consola = require('consola')
const { Nuxt, Builder } = require('nuxt')
const app = express()

// Import and Set Nuxt.js options
const config = require('../nuxt.config.js')
config.dev = !(process.env.NODE_ENV === 'production')

async function start() {
  // Init Nuxt.js
  const nuxt = new Nuxt(config)

  const { host, port } = nuxt.options.server

  // Build only in dev mode
  if (config.dev) {
    const builder = new Builder(nuxt)
    await builder.build()
  } else {
    await nuxt.ready()
  }

  // Give nuxt middleware to express
  app.use(nuxt.render)

  // Listen the server
  app.listen(port, host)
  consola.ready({
    message: `Server listening on http://${host}:${port}`,
    badge: true
  })
}
start()

【问题讨论】:

    标签: node.js docker npm virtual-machine


    【解决方案1】:

    Docker 也可以按照您建议的方式工作,使用 Host OS 中的 Volume Bind,它在开发中很有用,同时您可以编辑代码,并且 Docker 容器可以立即运行该代码。

    但是,在生产中,您不想遵循相同的做法。

    Docker 容器的主要原则是图像是不可变的 一旦构建完成,就无法更改,如果要进行更改,则需要构建一个新映像。

    你担心 Docker 可以在生产环境中加载所有必要的依赖项,就像本地一样,这个东西由package.lock.json 管理,这将确保无论何时有人运行npm install,它都会安装相同的依赖项。

    对于生产模式,您的 Docker 容器需要轻量化,以便您的代码和 node_modules 存在,并且最好在安装后删除 npm 缓存,以使您的 Docker 镜像大小尽可能小。保持较小的尺寸可以减少安全漏洞和快速部署的空间。

    【讨论】:

    • 从错误中,我可以看出您的index.js 有问题。您能否发布您的index.js 文件以获得更好的洞察力?
    • 这是 Nuxt.js + express 项目,我从不更改默认 index.js。
    • 你能重新安装node_modules吗?只需 ssh 进入容器并运行 npm install 并尝试运行 yarn dev
    • 您好,我重新安装了 npm,它现在可以托管网络了。谢谢。
    猜你喜欢
    • 2017-11-11
    • 2019-10-30
    • 2015-07-19
    • 2020-04-22
    • 2021-02-16
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多