我是多阶段构建和使用的新手
chown -R appuser:appuser /app
# Copy the virtual environment
COPY --from=builder --chown=appuser:appuser ${VIRTUAL_ENV} ${VIRTUAL_ENV}
# Copy application code
COPY --from=builder --chown=appuser:appuser /app /app
对
# Copy the virtual environment
COPY --from=builder ${VIRTUAL_ENV} ${VIRTUAL_ENV}
# Copy application code
COPY --from=builder /app /app
RUN chown -R appuser:appuser /app
相差4GB。我在这里错过了什么吗?第一种方法使用接近 20GB,而第二种方法仅使用 16GB
您提到的两种方法之间的磁盘使用差异是由于 Docker 处理文件系统层和权限更改的方式造成的。在 Docker 中,每个
RUN
、COPY
、ADD
(等)命令都会创建一个新层。使用单独的 RUN chown
命令更改文件权限会产生一个附加层,该层本质上复制数据但具有不同的权限。这可能会使权限更改的文件和目录的大小影响加倍,这可能就是您在第一种方法中看到额外 4GB 的原因。
为了更好地分解它,让我们看看您使用的两种方法。
第一种方法(内联
chown
与复制):
--chown=appuser:appuser
命令中使用 COPY
时,Docker 会在将文件复制到映像时应用所有权更改。这意味着文件将写入已设置最终所有权的图像,从而避免创建额外的层。第二种方法(单独的
chown
命令):
RUN chown -R appuser:appuser /app
命令在单独的步骤中更改所有权。这至少创建两层:一层用于复制的文件,另一层用于权限更改。我希望这有帮助。