问题描述
在Dockerfile中运行yarn安装时无法获取node_modules文件夹
稍作修改:从红宝石:2.5
RUN curl -sL https://deb.nodesource.com /setup_8.x | bash-&& \
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt键添加-&& \
echo deb https://dl.yarnpkg.com/debian/ stable main | tee /etc/apt/sources.list.d/yarn.list&& \
易于获取更新&& \
apt-get install -qq -y build-essential libpq-dev nodejs yarn
RUN mkdir / build&& mkdir / myapp
WORKDIR / build
添加./package.json / build /
RUN yarn install
WORKDIR / myapp
CMD cp -a / build / node_modules / / myapp /
纱线包将在图像中的 / build 文件夹中构建,并在容器启动后复制到 / myapp 文件夹中。 / p>
2。。您使用原始的 docker-compose.yaml 文件:
版本: 3
服务:
网站:
构建:。
量:
-。:/ myapp
开始时 web 容器:
docker-compose up web
文件夹 node_modules 被复制到已装载的文件夹,即。 主机上的文件夹。
3。。现在您可以启动任何容器,它将包含<$ / myapp 中的c $ c> node_modules 文件夹:
docker-compose run web bash
因此,您将能够实现目标
$ docker-compose build&& docker-compose up web
$ docker-compose run web bash
root @ 4b38e60adfa3:/ myapp#ls -la
总计64
drwxrwxr-x 3 1000 1000 4096 2月24 10 :59。
drwxr-xr-x 66根root 4096 Feb 24 11:13 ..
-rw-rw-r-- 1 1000 1000 497 Feb 24 10:55 Dockerfile
-rw-rw -r-- 1 1000 1000 73 2月24日09:02 docker-compose.yaml
drwxr-xr-x 818根root 40960 2月24日10:57 node_modules
-rw-rw-r-- 1根根333 Feb 23 22:07 package.json
Can't get node_modules folder when running yarn install in the Dockerfile
test-sof ├── docker-compose.yml ├── Dockerfile ├── package.json └── yarn.lockdocker-compose.yml
version: '3' services: web: build: . volumes: - .:/myapppackage.json
{ "name": "site", "private": true, "dependencies": { "@rails/webpacker": "^3.2.1", "babel-preset-react": "^6.24.1", "prop-types": "^15.6.0", "react": "^16.2.0", "react-dom": "^16.2.0", "reactjs": "^1.0.0", "underscore": "^1.8.3" }, "devDependencies": { "webpack-dev-server": "^2.11.1" } }Dockferfile
FROM ruby:2.5 RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - && \ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update && \ apt-get install -qq -y build-essential libpq-dev nodejs yarn RUN mkdir /myapp WORKDIR /myapp ADD ./package.json /myapp/ RUN yarn installoutput of the step RUN yarn install when docker-compose build:
Running command: docker-compose run web bash to get in the container
root@11af1818e494:/myapp# ls Dockerfile docker-compose.yml package.jsonno node_modules folder present, but later when running inside the container: yarn install output:
then when listing:
root@11af1818e494:/myapp# ls Dockerfile docker-compose.yml node_modules package.json yarn.lockfolder node_modules IT IS present. Why?
解决方案This part of Dockerfile installs yarn packages:
RUN mkdir /myapp WORKDIR /myapp ADD ./package.json /myapp/ RUN yarn installFolder /myapp is created, package.json is copied to it and yarn packages are installed. Build is successful and, of course, node_modules folder is inside built image.
But after that you start built image with:
volumes: - .:/myappwhich means that content of folder where docker-compose.yaml is is mounted to /myapp folder inside container, so it covers content of container's /myapp folder.
You don't need to mount current folder to container's folder to achieve what you want. Just delete it from your docker-compose.yaml:
version: '3' services: web: build: .Now you can:
$ docker-compose build $ docker-compose run web bash root@558d5b0c2ccb:/myapp# ls -la total 268 drwxr-xr-x 3 root root 4096 Feb 23 22:25 . drwxr-xr-x 65 root root 4096 Feb 23 22:36 .. drwxr-xr-x 818 root root 36864 Feb 23 22:25 node_modules -rw-rw-r-- 1 root root 333 Feb 23 22:07 package.json -rw-r--r-- 1 root root 219075 Feb 23 22:25 yarn.lockEDIT:
If you want to achieve the above goal, you can use the following workaround:
1. You modify Dockerfile a little:
FROM ruby:2.5 RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - && \ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update && \ apt-get install -qq -y build-essential libpq-dev nodejs yarn RUN mkdir /build && mkdir /myapp WORKDIR /build ADD ./package.json /build/ RUN yarn install WORKDIR /myapp CMD cp -a /build/node_modules/ /myapp/That's means that yarn packages will be built in /build folder inside image and copied to /myapp folder once container is started.
2. You use the original docker-compose.yaml file:
version: '3' services: web: build: . volumes: - .:/myappwhen you start web container:
docker-compose up webfolder node_modules is copied to mounted folder i.e. to . folder on your host machine.
3. Now you can start any container and it will be contain node_modules folder inside /myapp:
docker-compose run web bashSo, you will be able to achieve your goal the following way:
$ docker-compose build && docker-compose up web $ docker-compose run web bash root@4b38e60adfa3:/myapp# ls -la total 64 drwxrwxr-x 3 1000 1000 4096 Feb 24 10:59 . drwxr-xr-x 66 root root 4096 Feb 24 11:13 .. -rw-rw-r-- 1 1000 1000 497 Feb 24 10:55 Dockerfile -rw-rw-r-- 1 1000 1000 73 Feb 24 09:02 docker-compose.yaml drwxr-xr-x 818 root root 40960 Feb 24 10:57 node_modules -rw-rw-r-- 1 root root 333 Feb 23 22:07 package.json
这篇关于Docker在构建时丢失了纱线依赖的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!