Docker映像之间的常见命令

时间:2020-07-06 13:41:31

标签: docker dockerfile

我有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

是否可以删除此重复项?

2 个答案:

答案 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/