docker - Dockerfile 正确构建但 ADD 失败
问题描述
我对 Docker 很陌生,我正在尝试制作一个简单的 Dockerfile,它将高山图像与 python 图像结合起来。
这是 Dockerfile 的样子:
FROM alpine
RUN apk update &&\
apk add -q --progress \
bash \
bats \
curl \
figlet \
findutils \
git \
make \
mc \
nodejs \
openssh \
sed \
wget \
vim
ADD ./src/ /home/src/
WORKDIR /home/src/
FROM python:3.7.4-slim
运行时:
docker build -t alp-py .
图像正常构建。
当我跑
docker run -it alp-py bash
我可以访问 bash,但是当我 cd 到 /home/ 和 ls 时,它显示一个空目录:
root@5fb77bbc81a1:/# cd home
root@5fb77bbc81a1:/home# ls
root@5fb77bbc81a1:/home#
我已经尝试将 ADD 更改为 COPY 并尝试:
CPOY . /home/src/
但没有任何效果。
我究竟做错了什么?我错过了什么吗?谢谢!
解决方案
没有“组合 2 张图像”之类的东西。您应该将图像视为不同的虚拟机(仅用于理解概念 - 因为它们不止于此)。你不能把它们结合起来。
在您的示例中,您可以直接从 python 映像开始并在其上安装所需的工具:
FROM python:3.7.4-slim
RUN apt update &&\
apt-get install -y \
bash \
bats \
curl \
figlet \
findutils \
git \
make \
mc \
nodejs \
openssh \
sed \
wget \
vim
ADD ./src/ /home/src/
WORKDIR /home/src/
我没有测试是否所有软件包都可用,因此您可能需要进行一些研究以获取所有软件包,以防万一出现错误。
当您在 Dockerfile 中使用 2 个 FROM 语句时,您正在创建一个多阶段构建。如果您想创建一个不包含源代码但仅包含产品二进制文件的最终图像,这将非常有用(第一阶段构建源代码,第二阶段仅从第一个阶段复制二进制文件)。
推荐阅读
- ios - 关闭presentedViewController 也会关闭呈现视图控制器
- javascript - 如何处理显示中的必填字段:“无”
- git - 当 B 也是 C 的子模块时,子模块 A 可以是项目 B 和 C 的子模块吗?
- javascript - 如何使用我的反应应用程序中的 useState 钩子给出的 setState 方法增加状态对象的选定索引的计数
- excel - VBA - 绕过剪贴板传输(除了值)
- php - Mysql - 按 desc 和随机顺序获取记录
- java - 为什么Java允许用负许可初始化信号量?
- javascript - 如何在 forEach 或 for 循环或映射中添加 formData 在本机反应
- python - 从复杂的文本文件中读取和提取数据
- azure - 将 Azure Databricks 与 Netapp 连接