我是一名Web开发人员,目前正在从事next.js项目(这只是SSR ReactJS的框架)。我在该项目上使用Docker配置,添加/删除依赖项时发现了一个问题。添加依赖项时,构建我的项目并使用docker-compose进行构建,新的依赖项不会添加到我的Docker映像中。我必须使用docker system prune
清理docker系统以重置所有内容,然后才能构建和启动项目。之后,将我的依赖项添加到我的Docker容器中。
我使用Dockerfile
来配置映像,并使用不同的docker-compose
文件来根据环境设置不同的配置。这是我的配置:
Dockerfile
FROM node:10.13.0-alpine
# SET environment variables
ENV NODE_VERSION 10.13.0
ENV YARN_VERSION 1.12.3
# Install Yarn
RUN apk add --no-cache --virtual .build-deps-yarn curl \
&& curl -fSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" \
&& tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/ \
&& ln -snf /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn \
&& ln -snf /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg \
&& rm yarn-v$YARN_VERSION.tar.gz \
&& apk del .build-deps-yarn
# Create app directory
RUN mkdir /website
WORKDIR /website
ADD package*.json /website
# Install app dependencies
RUN yarn install
# Build source files
COPY . /website/
RUN yarn run build
docker-compose.yml(dev env)
version: "3"
services:
app:
container_name: website
build:
context: .
ports:
- "3000:3000"
- "3332:3332"
- "9229:9229"
volumes:
- /website/node_modules/
- .:/website
command: yarn run dev 0.0.0.0 3000
environment:
SERVER_URL: https://XXXXXXX.com
以下是用于运行Docker环境的命令:
docker-compose build --no-cache
docker-compose up
我想我的Docker配置有问题,但是我无法抓住它。您有帮助我的主意吗?
谢谢!
答案 0 :(得分:1)
您当前的卷尚未设置为可以执行的操作。下面的当前设置表示您正在用本地website
目录覆盖容器中.
目录的内容。
volumes:
- /website/node_modules/
- .:/website
我确定您的意图是首先将本地目录映射到容器中,然后使用映像的node_modules目录的原始内容(即node_modules
)覆盖/website/node_modules/
。
按如下所示更改卷的顺序应该可以解决此问题。
volumes:
- .:/website
- /website/node_modules/
答案 1 :(得分:0)
您明确告诉Docker您想要这种行为。当你说:
volumes:
- /website/node_modules/
您正在告诉Docker您不想使用映像中包含的node_modules
目录。相反,它应该创建一个匿名卷来保存node_modules
目录(该目录在首次使用时具有某些特殊行为),并将数据保留在那里,即使基础图像等其他特性发生了变化。
这意味着,如果您更改package.json
并重建映像,则Docker将继续使用node_modules
目录的批量版本。 (类似地,.:/website
的绑定装载意味着基本上忽略了Dockerfile的后半部分中的所有其他内容。)
我将删除此设置中的volumes:
块,以尊重图像中内置的程序。 (我还建议将command:
移到CMD
中的Dockerfile
行。)在不使用Docker的情况下开发和测试您的应用程序,并在其基本运行后构建并部署映像,但之前没有。