当我开发示例应用程序并读取停靠程序文档时,我注意到COPY命令和bind-mount之间的区别是什么,我们的设置如下所示。我知道COPY将在初始构建时将本地文件复制到容器,time.and bind-mount将本地目录同步到容器目录。
这似乎是相同的功能。所以我想知道如何正确地使用它们。如果有人有意见,请告诉我。谢谢
docker-compose
version: "3"
services:
form-api:
container_name: "api"
env_file: .env.development
build:
context: .
dockerfile: ./packagesapi/Dockerfile
tty: true
ports:
- 3303:3303
depends_on:
- dynamodb-local
- database
volumes:
- ./packages/form-api/:/app/packages/form-api/
- ./packages/infrastructure/:/app/packages/infrastructure/
- ./packages/library/:/app/packages/library/dockerfile
FROM node:16.10-buster
ENV LANG C.UTF-8
ENV TZ 'Asia/Tokyo'
ENV DEBCONF_NOWARNINGS=yes
# Create app directory
WORKDIR /app
RUN apt-get update && apt-get install -y postgresql-client
RUN npm install -g npm@7.18.1 serverless serverless-offline
# root
COPY .npmrc ./
COPY ./package*.json ./
COPY ./tsconfig.json ./
COPY ./tsconfig.build.json ./
COPY ./packages/library ./packages/library
COPY ./packages/infrastructure/ ./packages/infrastructure/
COPY ./packages/form-api/ ./packages/form-api/
RUN npm install发布于 2022-07-25 10:50:32
您应该从您的volumes:文件中删除docker-compose.yml,并确保将应用程序代码放入映像中。另外,不要忘记在Dockerfile中设置一个CMD。
Docker的核心概念之一是,图像是应用程序的不可变、独立的副本。就像您不下载Firefox,然后单独下载它的源代码一样,图像应该可以自己运行。理想就是能跑
docker run --name api -d -p 3000:3000 your-image虽然这并不总是可能的,但通常情况下,如果在Dockerfile或运行时选项中指定内容是合理的,则最好将它们放在Dockerfile中。
另一个考虑因素是像Kubernetes这样的集群环境。在那里,几乎不可能将源代码上传到卷中,但使用Docker映像是非常简单的。
我还看到一些问题出现在Dockerfile中,这些工作是由绑定挂载隐藏的。这可能和丢失的RUN chmod +x一样少,或者偶尔图像会重新排列文件。如果要用绑定挂载覆盖图像内容,则没有运行实际映像,也没有测试没有挂载的标准设置。
尤其是对于Node应用程序,“模式”似乎是用绑定挂载覆盖整个图像内容。但是,如果您正在这样做,那么您的自定义映像中没有任何内容,您还不如使用绑定挂载运行一个node映像。但是,如果您这样做,那么您将更多地处理Docker的文件系统隔离问题,而不是从中获益;您最好直接在您的主机上运行Node,而不必为这个设置操心。
COPY的缺点是,您需要在应用程序代码更改时重建映像,即使您的应用程序不需要构建步骤。这也是本地环境可以派上用场的地方: Docker有时会干扰实时重新加载的设置,但是它们在实际的本地环境中会很好地工作,所以您可以在本地构建、开发和测试应用程序,并且一旦它工作成功,就将它带到Docker中进行集成测试。
https://stackoverflow.com/questions/73107728
复制相似问题