我有4张图片,它们没有共享相同的基本图片:
image1 : FROM openjdk:8
image2 : FROM mongo:3.6
image3 : FROM ssh
image4 : FROM ubuntu
但是在某些时候,我必须对所有命令执行相同的命令,例如:
RUN useradd -s /bin/bash -p $(openssl passwd -1 user) -d /home/user -m -G sudo user
USER user
WORKDIR /home/user
RUN mkdir -p /home/user/.ssh/ && \
chmod 0700 /home/user/.ssh && \
touch /home/user/.ssh/authorized_keys && \
chmod 600 /home/user/.ssh/authorized_keys && \
touch /home/user/.ssh/config && \
chmod 600 /home/user/.ssh/config
COPY ssh-keys/ /keys/
RUN cat /keys/id_rsa.pub >> /home/user/.ssh/authorized_keys
RUN cat /keys/config >> /home/user/.ssh/config
并具有相同的目录结构:
image1
--->ssh-keys
------>config
------>id_rsa
------>id_rsa.pub
--->Dockerfile
image2
--->ssh-keys
------>config
------>id_rsa
------>id_rsa.pub
--->Dockerfile
image3
--->ssh-keys
------>config
------>id_rsa
------>id_rsa.pub
--->Dockerfile
image4
--->ssh-keys
------>config
------>id_rsa
------>id_rsa.pub
--->Dockerfile
是否可以删除此重复项?
答案 0 :(得分:1)
您可能想研究使用multi-stage build作为所有图像的基础,并根据需要从那里扩展;也许您的基地可能是这样的:
FROM scratch
# I like to keep all my image files under a single directory
COPY rootfs/ /
然后,在您的其他Dockerfile
中:
FROM your-base-image AS base
FROM openjdk:8
COPY --from=base / /
[...]
缺点是只有某些操作可以按您期望的那样在多阶段构建中起作用,但是复制文件是应该的。
答案 1 :(得分:1)
Scratch
不包含任何内容,最好将alpine用作基本图像,并从可重复使用的部分中删除以下命令
RUN useradd -s /bin/bash -p $(openssl passwd -1 user) -d /home/user -m -G sudo user
USER user
由于这些命令因操作系统而异,因此在高山等环境中将无法使用
所以我会建议类似的东西
image1
--->Dockerfile
image2
--->Dockerfile
baseimage
--->ssh-keys
------>config
------>id_rsa
------>id_rsa.pub
--->Dockerfile
设计基本图片
FROM alpine as sshconfig
WORKDIR /home/user
RUN mkdir -p /home/user/.ssh/ && \
chmod 0700 /home/user/.ssh && \
touch /home/user/.ssh/authorized_keys && \
chmod 600 /home/user/.ssh/authorized_keys && \
touch /home/user/.ssh/config && \
chmod 600 /home/user/.ssh/config
COPY ssh-keys/ /keys/
RUN cat /keys/id_rsa.pub >> /home/user/.ssh/authorized_keys
RUN cat /keys/config >> /home/user/.ssh/config
构建此图像
docker build -t sshconfig .
现在,后续的Docker映像将从该sshconfig
Docker基本映像中复制。
图片1
FROM ubuntu
# Add user
# change user
# copy ssh-config from base image
COPY --from=sshconfig /home/user/.ssh /home/user/.ssh
#for testing and verify keys
COPY --from=sshconfig /keys/ /keys/
# list keys copies form base image
RUN ls -lstrah /home/user/ /home/user/.ssh /keys/