实际上要为nodejs创建dockerfile,我在nodejs基础映像上使用以下命令:
RUN
apt-get update &&
apt-get install -y --no-install-recommends git python build-essential libpng-dev &&
apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Install production package only
COPY package.json /var/www/site
RUN
npm install &&
npm cache clean
COPY . /var/www/site
RUN
npm run build &&
npm run doc
RUN
npm prune --production &&
npm cache clean
ENV NODE_ENV=production
我对这个方法不满意,因为我需要运行"npm run build"来创建应用程序的客户端部分(基于webpack, backbone, marionnette)。
当我运行"npm run build"命令时,我必须安装开发包,而不仅仅是生产包,还有一些debian包来最小化映像。
我希望图像只包含生产包而不包含开发包。
另一方面,如果我只放置产品文件,我必须在构建机器上生成客户端代码。所以我必须在主机上安装nodejs和所有必要的包。我更喜欢用docker来构建。
在第二次我想服务静态文件直接从nginx,而不是从nodejs组件。但是我不想在nginx镜像上安装node。
docker的基本实践是什么?构建所有的docker有可复制的图像?在docker中只构建主机和包的结果?
谢谢
我认为最好的方法是使用两个步骤,因为使用一个构建很难,并且在大多数情况下图像不会干净。
第一个容器将源文件放在一个卷中,并在您的机器(或CI)上构建静态文件。你不需要安装任何其他的东西,它将保持可复制性。
然后你可以使用静态文件来构建nginx镜像。
你可以使用例如Makefile,所以你只需要输入一个简短的命令