我有一个docker镜像,可以安装ubuntu和RUN
一些额外的命令,比如安装NodeJS。
Dockerfile(与docker-compose.yml
结合使用)还会将目录安装到主机上的目录中。看起来像这样:
services:
test:
build:
context: ../../
dockerfile: docker/Dev/Dockerfile
ports:
- 7000:7000
volumes:
- ./../../src:/src
在Dockerfile
我有一个卷的以下行:
VOLUME ["/src"]
WORKDIR /src
当我使用docker-compose up
运行容器,然后在容器的已安装ls -a
文件夹中执行src/
时,我会看到我在主机上看到的所有文件。到目前为止一切都很好。
(命令我也在容器中查看:docker exec -it <container hash> ls -a
)
由于所有文件都在那里,包括package.json
,我在我的RUN
添加了一个新的Dockerfile
命令:npm install
。所以我有这个:
VOLUME ["/src"]
WORKDIR /src
RUN npm install
除了给我一个错误,它在package.json
文件夹中找不到src/
。
当我添加RUN ls -a
时(请记住,我切换到带有src/
的{{1}}文件夹),然后它显示它是一个空目录......
所以在WORKDIR
我有:
Dockerfile
但是,在我执行VOLUME ["/src"]
WORKDIR /src
# shows that /src is empty. If I do 'RUN pwd', then it shows I really am in /src
RUN ls -a
RUN npm install
然后再次在容器的docker-compose up
文件夹中执行ls -a
后,它会再次显示我的所有源文件。
所以我的问题是,为什么他们不在构建期间(我正在运行/src
)?
解决此问题的方法是什么?
答案 0 :(得分:3)
您误解了Dockerfile中的VOLUME
命令与-v
守护程序的docker
标志之间的区别(docker-compose
用于其卷的内容)。< / p>
volumes
文件中docker-compose
项下的值告诉docker
在图像构建完成后,中要映射的目录。在构建过程中不使用它们。
幸运的是,由于撰写文件中的context
行,您可以自动访问所有源文件 - 它们只位于本地src
目录中,而不是您当前的工作目录!
尝试将Dockerfile更新为以下内容:
# NOTE: You don't want a VOLUME directive if you only want to mount a local
# directory. WORKDIR is optional, but doesn't matter for my example,
# so I'm omitting it.
# Copy the npm files into your Docker image. If you do this first, the docker
# daemon can cache the built layers, making your images build faster and be
# substantially smaller, since most of your dependencies will remain unchanged
# between builds.
COPY src/package.json package.json
COPY src/npm-shrinkwrap.json npm-shrinkwrap.json
# Actually install the dependencies.
RUN npm install
# Copy all of your source files from the `src` directory into the Docker image.
COPY src .
现在,这里有一个问题:您可能已在npm
下安装了src/node_modules
个模块。因此,除了最终的COPY
行之外,您可以放弃上述所有内容,也可以将src/node_modules
添加到构建根目录中的.dockerignore
文件中(../..
)。