是什么原因导致yarn / 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
将服务命令更改为sleep 300s
的{{1}}和exect -it
和ls -la
来查找:
/home/node/app/node_modules
当.yarn-integrity
出现时,
cat .yarn-integrity
答案 0 :(得分:0)
您可以在构建期间安装节点程序包,并且如从日志中看到的那样正确安装,没有任何错误。因此出现了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
移动到入口点或不附加节点模块的卷。
答案 1 :(得分:0)
我通过COPY指令利用了Docker的缓存系统找到了一个解决方案,我已将其设置为COPY package.json,package-lock.json和yarn.lock;
会缓存构建步骤,并且仅在文件存在差异时才更新,否则跳过重新安装软件包。总而言之,Docker组合中的服务与卷相同,并遵循社区中针对nodejs项目共享的最佳实践。
我们可以在volumes
中看到一个绑定安装./foobar-blog-ui/:/home/node/app
,该绑定安装将主机上的App源代码安装到容器中的app目录中。这样可以提供一个快速的开发环境,因为我们在主机中所做的更改会立即填充到容器中,否则无法进行。
最后,我命名为node_modules
的{{1}}的命名卷是非常棘手的,因为我们首先通过绑定挂载包含{{1} }坐。在容器中创建ui_node_modules
运行node_modules
目录时,对吗?但是我们声明的npm install
隐藏了它。因此,名为node_modules
的名为bind-mount
的卷通过将node_modules
目录的内容持久保存到容器中并绕过隐藏的ui_node_modules
来解决该问题。
/home/node/app/node_modules
但是Dockerfile包含复制package * .json文件的指令,有助于确定何时应更新指令步骤或指令层的Docker缓存。
bind-mount
希望这对以后的人有帮助!