小编典典

当我的开发环境将我的代码库安装到容器中时,如何构建docker映像?

docker

我对应用程序进行了docker化处理,但是要查看我的更改,我必须重建图像,并且不能为我提供应用程序的实时预览。

因此,我创建了一个docker-
compose环境,该环境将redis链接到我的节点容器,然后将源代码从主机挂载到节点应用程序并监视其更改。但是,由于代码不是UnionFS的一部分,因此无法进行容器化。

如何设置一个开发环境,该环境可以生成dockerized映像,但是每次更改代码库时都不必重新启动?


阅读 245

收藏
2020-06-17

共1个答案

小编典典

您用来开发和安装目录的容器映像应该与您在其他地方运行应用程序时生成的映像相同,或者如果无法实现,则至少基于生产映像。

以一个简单的节点应用程序为例,以下是基本图像:

FROM node:6
ENV NODE_ENV=production
RUN npm install forever -g
COPY docker-entrypoint.sh /entrypoint.sh
WORKDIR /app
COPY package.json /app/
RUN npm install
COPY . /app
EXPOSE 3000
ENTRYPOINT ["/entrypoint.sh"]
CMD ["node", "/app/index.js"]

生产

docker run \
  --detach \
  --restart always \
  --publish 3000:3000 \
  myapp

发展历程

docker run \
  --publish 3000:3000 \
  --volume .:/app \
  --env NODE_ENV=development \
  myapp \
  forever -w /app/index.js

所以我修改了挂载,但是基本映像是相同的。挂载的文件替换了容器中的“内置”文件。

对于node.js应用程序,还有一些额外的开发更改。环境变量和用于监视/重启更改的命令。更改中的依赖项时,还需要npm install在容器中手动执行。docker exec $container npm install``package.json

开发Dockerfile

如果您需要对开发环境进行大量修改,并且不想手动指定它们,则可以FROM在包含开发细节的基础映像中创建一个开发映像。Dockerfile.dev

from myapp:latest
env NODE_ENV=development
volume ["/app"]
command ["forever", "-w", "--watchDirectory", "/app" "/app/index.js"]

然后,开发细节将存储在新映像中,但仍链接到您的真实映像。

docker build -f Dockerfile.dev -t myapp-dev .
docker run -p 3000:3000 -v .:/app myapp-dev
2020-06-17