如何在 Docker 容器内从头开始构建新应用程序?

ale*_*r09 5 development-environment docker dockerfile docker-compose

Docker据说可以帮助隔离应用程序环境,并帮助开发人员运行相同的环境。但所有指南、教程、课程等都是从已经构建的应用程序开始的。那么我如何从头开始一个新的应用程序,比如说在 NodeJS 中?

所以最近我开始学习 docker,是的,如果我已经在本地主机上安装了所有内容,那么它对于打包已经构建的应用程序很有用。

但是我如何开始开发一个新的应用程序呢?例如在 NodeJS 中,由于主机没有安装 NodeJS,因此我无法访问npm init我的文件夹。我将如何安装新的软件包,如何node_modules持久化,等等?

这是我用于打包和应用程序的一些非常基础的设置......这不适合我从头开始。

FROM node:10-alpine

WORKDIR /usr/src/app

COPY package*.json ./
RUN npm install

COPY . .

CMD [ "npm", "start" ]
Run Code Online (Sandbox Code Playgroud)
version: '3'

services:
  example-service:
    build: .
    volumes:
      - .:/usr/src/app
      - /usr/src/app/node_modules
    ports:
      - 3000:3000
      - 9229:9229
    command: npm start
Run Code Online (Sandbox Code Playgroud)
dev:
  docker-compose up
Run Code Online (Sandbox Code Playgroud)

如代码中所示,我有一个自定义映像、一个 docker-compose 和一个 makefile。我可以改变其中的任何一部分或全部。我想要的是开发我的应用程序,除了docker之外,我的主机上没有安装任何东西,容器应该隔离应用程序所需的所有内容,最佳实践是在开发过程中保留安装的任何新包。

Von*_*onC 2

您可以关注Cody Craven的“如何使用 Docker 进行 Node.js 开发” :

它确实使用 Docker 本身来开发,而不仅仅是部署/运行 NodeJS 应用程序。

例子:

# This will use the node:8.11.4-alpine image to run `npm init`
# with the current directory mounted into the container.
#
# Follow the prompts to create your package.json
docker run --init --rm -it -v "${PWD}:/src" -w /src node:8.11.4-alpine npm init
Run Code Online (Sandbox Code Playgroud)

然后您可以使用以下命令设置执行环境:

FROM node:8.11.4-alpine AS dev
WORKDIR /usr/src/app
ENV NODE_ENV development
COPY . .
# You could use `yarn install` if you prefer.
RUN npm install
Run Code Online (Sandbox Code Playgroud)

并构建您的应用程序:

# Replace YOUR-NAMESPACE/YOUR-IMAGE with the name you would like to use.
docker build -t YOUR-NAMESPACE/YOUR-IMAGE:dev --target dev .
Run Code Online (Sandbox Code Playgroud)

并运行它:

# The `YOUR COMMAND` portion can be replaced with whatever command you
# would like to use in your container.
docker run --rm -it --init -v "${PWD}:/usr/src/app" YOUR-NAMESPACE/YOUR-IMAGE:dev YOUR COMMAND
Run Code Online (Sandbox Code Playgroud)

全部无需在您的工作站上安装节点!