[英]Docker build does not install packages in `node_modules` volumes
是什么原因导致纱线/ npm安装没有在一个卷中安装任何软件包?
我有一个Dockerfile,其中包含运行RUN yarn安装的指令(已通过NPM和YARN进行了测试),但是容器内的软件包node_modules
目录为空。 如果我exec -it service_name bash
并手动运行install命令,它将正确安装软件包。 重构后,我注意到了这一点,在这里,我有一个Worker服务来执行安装过程,第二个要运行开发服务器。 决定将所有内容保留在相同的Docker-compose声明中,但由于问题开始发生,因此一直存在。 尝试完全重置等,但没有成功(关闭,rm容器,修剪等)。
在Docker-compose文件中声明的有问题的服务:
node_dev:
build:
context: .
dockerfile: ./.docker/dockerFiles/node.yml
image: foobar/node_dev:latest
container_name: node_dev
working_dir: /home/node/app
ports:
- 8000:8000
- 9000:9000
environment:
- NODE_ENV=development
- GATSBY_WEBPACK_PUBLICPATH=/
volumes:
- ./foobar-blog-ui/:/home/node/app
- ui_node_modules:/home/node/app/node_modules
- ui_gatsbycli_node_module:/usr/local/lib/node_modules/gatsby-cli
- ./.docker/scripts/wait-for-it.sh:/home/node/wait-for-it.sh
command: /bin/bash -c '/home/node/wait-for-it.sh wordpress-reverse-proxy:80 -t 10 -- yarn start'
depends_on:
- mysql
- wordpress
networks:
- foobar-wordpress-network
服务中的相关Volumes
参考:
volumes:
ui_node_modules:
ui_gatsbycli_node_module:
最后,生成镜像的Dockerfile:
FROM node:8.16.0-slim
ARG NODE_ENV=development
ENV NODE_ENV=${NODE_ENV}
WORKDIR /home/node/app
RUN apt-get update
RUN apt-get install -y rsync vim git libpng-dev libjpeg-dev libxi6 build-essential libgl1-mesa-glx
RUN yarn global add gatsby-cli
RUN yarn install
另外,尝试yarn install --force --no-lockfile
并确保在项目根目录中没有任何软件包或纱线锁定文件的情况下对它进行了测试,反之亦然。
我发现这很奇怪,肯定是某个地方有错字,但我还没发现。
主机系统是macOS Mojave。
我想提到的是,如果exec -it service_name bash
并执行NPM / YARN安装,则node_modules会填充软件包。 在进行大多数测试之前,我还尝试通过以下方式重置:
docker-compose stop
docker-compose rm -f
docker volume prune -f
docker network prune -f
现在测试:
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker volume prune -f
docker volume rm $(docker volume ls -qf dangling=true)
docker network prune -f
docker system prune --all --force --volumes
rm -rf ./.docker/certs/ ./.docker/certs-data/ ./.docker/logs/nginx/ ./.docker/mysql/data
特定图像的日志:
Building node_dev
Step 1/8 : FROM node:8.16.0-slim
8.16.0-slim: Pulling from library/node
9fc222b64b0a: Pull complete
7d73b1e8f94b: Pull complete
1059045652d5: Pull complete
08cd60b80e4e: Pull complete
b7d875c65da4: Pull complete
Digest: sha256:0ec7ac448d11fa1d162fb6fd503ec83747c80dcf74bdf937b507b189b610756a
Status: Downloaded newer image for node:8.16.0-slim
---> 67857c9b26e1
Step 2/8 : ARG NODE_ENV=development
---> Running in da99a137d733
Removing intermediate container da99a137d733
---> 0f9b718d3f66
Step 3/8 : ARG NPM_TOKEN=3ea44a41-9293-4569-a235-a622ae216d60
---> Running in e339a4939029
Removing intermediate container e339a4939029
---> e47b42008bc3
Step 4/8 : ENV NODE_ENV=${NODE_ENV}
---> Running in fdc09147e9da
Removing intermediate container fdc09147e9da
---> 3b28ab5539d3
Step 5/8 : WORKDIR /home/node/app
---> Running in 44eef1d9293d
Removing intermediate container 44eef1d9293d
---> 2d07ecf3de2e
Step 6/8 : RUN echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > .npmrc
---> Running in a47d5e22839b
Removing intermediate container a47d5e22839b
---> bd9f896846b7
Step 7/8 : RUN yarn global add gatsby-cli
---> Running in ca3e74d12df4
yarn global v1.15.2
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
success Installed "gatsby-cli@2.7.47" with binaries:
- gatsby
Done in 15.51s.
Removing intermediate container ca3e74d12df4
---> bc8d15985ad0
Step 8/8 : RUN yarn install --force --no-lockfile
---> Running in 3f0e35e5487b
yarn install v1.15.2
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Rebuilding all packages...
Done in 0.04s.
Removing intermediate container 3f0e35e5487b
---> 485b9e9bccba
Successfully built 485b9e9bccba
Successfully tagged foobar/node_dev:latest
将Service命令更改为sleep 300s
并在/home/node/app/node_modules
执行exect -it
和ls -la
查找:
.yarn-integrity
当cat .yarn-integrity
我看到:
{
"systemParams": "linux-x64-57",
"modulesFolders": [],
"flags": [],
"linkedModules": [],
"topLevelPatterns": [],
"lockfileEntries": {},
"files": [],
"artifacts": {}
}
您可以在构建期间安装节点软件包,并且可以从日志中看到正确安装,并且没有任何错误。 因此,问题与docker-compose或现有卷有关。
因此,可以帮助您调试的一件事是创建卷,然后尝试使用docker run而不是docker-compose。
docker volume create my_node_modules
docker run -it --rm -v my_node_modules:/home/node/app foobar/node_dev:lates bash -c "cd /home/node/app;npm list"
因此,现在通过连接任何容器来验证容量,以检查容量
docker run -it --rm -v my_node_modules:/home/test/ node:alpine ash -c "cd /home/test/;npm list"
另一个选择是在运行时安装软件包,然后已安装的软件包将在任何卷中都可用。
command: /bin/bash -c '/home/node/wait-for-it.sh wordpress-reverse-proxy:80 -t 10 -- yarn install && yarn start'
要验证软件包是否退出,请尝试在没有docker-compose的情况下运行。
docker run -it --rm foobar/node_dev:lates bash -c "cd /home/node/app;npm list"
将yarn install
移动到入口点,或者不为节点模块连接卷。
我通过COPY指令利用了Docker的缓存系统,找到了一个解决方案,我将其设置为COPY package.json,package-lock.json和yarn.lock;。 它将缓存构建步骤,并且仅在文件中存在差异时才更新,否则跳过重新安装软件包。
总而言之,Docker组合中的服务与卷保持不变,并遵循社区中针对nodejs项目共享的最佳实践。
我们可以在volumes
看到一个bind-mount ./foobar-blog-ui/:/home/node/app
,它将主机上的App源代码安装到容器中的app目录。 这样可以提供快速的开发环境,因为我们在主机中所做的更改会立即填充到容器中,否则无法进行。
最后,我命名为ui_node_modules
的node_modules
的命名卷,在我们开始进行绑定安装时,要理解其中包括node_modules
所在根目录的应用程序源代码,要理解它非常棘手。 当npm install
运行时,在容器中创建了node_modules
目录,对吗? 但是我们声明的bind-mount
隐藏了它。 因此,命名node_modules
称为卷ui_node_modules
通过持续的内容解决它/home/node/app/node_modules
目录放入容器并绕过隐藏bind-mount
。
node_dev:
build:
context: .
dockerfile: ./.docker/dockerFiles/node.yml
image: foobar/node_dev:latest
container_name: node_dev
working_dir: /home/node/app
ports:
- 8000:8000
- 9000:9000
environment:
- NODE_ENV=development
- GATSBY_WEBPACK_PUBLICPATH=/
volumes:
- ./foobar-blog-ui/:/home/node/app
- ui_node_modules:/home/node/app/node_modules
- ui_gatsbycli_node_module:/usr/local/lib/node_modules/gatsby-cli
- ./.docker/scripts/wait-for-it.sh:/home/node/wait-for-it.sh
command: /bin/bash -c '/home/node/wait-for-it.sh wordpress-reverse-proxy:80 -t 10 -- yarn start'
depends_on:
- mysql
- wordpress
networks:
- foobar-wordpress-network
volumes:
ui_node_modules:
ui_gatsbycli_node_module:
但是Dockerfile包含复制package * .json文件的指令,这有助于确定何时应更新指令步骤或层的Docker缓存。
FROM node:8.16.0-slim
ARG NODE_ENV=development
ENV NODE_ENV=${NODE_ENV}
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# The package files should use Docker cache system
COPY ./foobar-blog-ui/package*.json .
COPY ./foobar-blog-ui/yarn.lock .
RUN yarn global add gatsby-cli
RUN yarn install
RUN apt-get update
RUN apt-get install -y rsync vim git libpng-dev libjpeg-dev libxi6 build-essential libgl1-mesa-glx
EXPOSE 8000
希望这对以后的人有所帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.