Docker:开发和生产环境的最佳实践

7

假设我有一个简单的node.js应用程序。我可以使用以下简单的Dockerfile构建容器来运行该应用程序:

FROM ubuntu:16.04
RUN apt-get update && apt-get install -y nodejs nodejs-legacy npm
COPY . /app
WORKDIR /app
RUN npm install
CMD node index.js

这将把源代码复制到容器中,然后我可以轻松地将它发送到注册表。但是在开发过程中,我不想为代码的每一次更改重新构建容器。因此,自然而然地,我使用了一个卷来结合nodemon。以下是我的问题:
  • 如何保留不同的配置?两个Dockerfile?使用两个不同的compose文件?
  • 我的主机上的node_nodules文件夹与容器中所需的不同(即主机上全局安装了某些包)。我能从卷中排除它吗?如果可以,那么在挂载卷之后,我需要运行npm install。我该怎么做?
因此,我的问题是:如何保持dev和deploy环境分离?两个Dockerfiles?两个compose文件?有最佳实践吗?

开发和生产有什么不同?你可以使用环境来实现吗? - Bukharov Sergey
3个回答

5
所以我处理的方式是我有两个Docker文件(DockerfileDockerfile.dev)。
Dockerfile.dev中,我有:
FROM node:6

# Update the repository
RUN apt-get update

# useful tools if need to ssh in or used by other tools
RUN apt-get install -y curl net-tools jq

# app location
ENV ROOT /usr/src/app

COPY package.json /usr/src/app/

# copy over private npm repo access file
ADD .npmrc /usr/src/app/.npmrc

# set working directory
WORKDIR ${ROOT}

# install packages
RUN npm install

# copy all other files over
COPY . ${ROOT}

# start it up
CMD [ "npm", "run", "start" ]

# what port should I have
EXPOSE 3000

我的NPM脚本长这样

"scripts": {
    ....
    "start": "node_modules/.bin/supervisor -e js,json --watch './src/' --no-restart-on error ./index.js",
    "start-production": "node index.js",
    ....
},

你会注意到它使用supervisor进行启动,因此对src下的任何文件进行更改都会导致服务器重新启动,而无需重新启动docker。

最后是docker compose。

dev:
  build: .
  dockerfile: Dockerfile.dev
  volumes:
    - "./src:/usr/src/app/src"
    - "./node_modules:/usr/src/node_modules"
  ports:
    - "3000:3000"

prod:
  build: .
  dockerfile: Dockerfile
  ports:
    - "3000:3000"

在开发模式下,它会将当前目录的src文件夹挂载到容器的/usr/src/app/srcnode_modules目录挂载到/usr/src/node_modules。这样我就可以在本地进行更改并保存,卷会更新容器的文件,然后监督程序会看到此更改并重新启动服务器。
请注意,由于它不监视node_modules文件夹,您必须更改src目录中的另一个文件才能执行重启。

3
使用环境变量。请参阅文档Docker env。这是推荐的方式,也适用于生产环境。

1
docker run -e FOO_VAR=$FOO_VAR 容器运行 -e FOO_VAR=$FOO_VAR - Nico de Wet

1
你可以使用单个Dockerfile,在其中声明部分。
请记住,除非在docker run中明确指定了-v <path>:<path>选项,否则卷不会被挂载。如果有这样的情况,您甚至可以在生产环境中声明多个。

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