首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >docker镜像之间的通用命令

docker镜像之间的通用命令
EN

Stack Overflow用户
提问于 2020-07-06 21:41:31
回答 2查看 120关注 0票数 2

我有4个图像,它们不共享相同的基本图像:

代码语言:javascript
复制
image1 : FROM openjdk:8  
image2 : FROM mongo:3.6  
image3 : FROM ssh  
image4 : FROM ubuntu  

但在某些情况下,我必须对所有这些命令执行相同的命令,例如:

代码语言:javascript
复制
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

并且具有相同的目录结构:

代码语言:javascript
复制
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

有没有办法消除这种重复?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-07 09:09:23

Scratch不包含任何内容,最好使用alpine作为基础镜像,并从可重用部分中删除以下命令

代码语言:javascript
复制
RUN useradd -s /bin/bash -p $(openssl passwd -1 user) -d /home/user -m -G sudo user
USER user

由于这些命令随操作系统(基础映像)的不同而不同,因此它在高山等环境中不起作用

因此,我将提出如下建议

代码语言:javascript
复制
image1  
--->Dockerfile
image2  
--->Dockerfile
baseimage
--->ssh-keys  
------>config  
------>id_rsa  
------>id_rsa.pub  
--->Dockerfile

设计基础图像

代码语言:javascript
复制
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

构建此镜像

代码语言:javascript
复制
docker build -t sshconfig .

现在,后续的Docker镜像将从此sshconfig Docker基础镜像复制。

Image1

代码语言:javascript
复制
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/
票数 1
EN

Stack Overflow用户

发布于 2020-07-07 00:22:41

您可能希望考虑使用multi-stage build作为所有图像的基础,并根据需要进行扩展;也许您的基础可以是这样的:

代码语言:javascript
复制
FROM scratch

# I like to keep all my image files under a single directory
COPY rootfs/ /

然后,在您的其他Dockerfile中:

代码语言:javascript
复制
FROM your-base-image AS base
FROM openjdk:8

COPY --from=base / /

[...]

缺点是,在多阶段构建中,只有某些操作会像您预期的那样工作,但复制文件应该是其中之一。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62757385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档