如何使用多个dockerfiles进行单个应用程序

问题描述 投票:0回答:1

我正在使用centos os基本映像并使用以下dockerfile安装python3

FROM centos:7
ENV container docker

ARG USER=dsadmin
ARG HOMEDIR=/home/${USER}

RUN yum clean all \
    && yum update -q -y -t \
    && yum install file -q -y

RUN useradd -s /bin/bash -d ${HOMEDIR} ${USER} 
RUN export LC_ALL=en_US.UTF-8

# install Development Tools to get gcc
RUN yum groupinstall -y "Development Tools"

# install python development so that pip can compile packages
RUN yum -y install epel-release && yum clean all \
    && yum install -y python34-setuptools \
    && yum install -y python34-devel

# install pip
RUN easy_install-3.4 pip

# install virtualenv or virtualenvwrapper
RUN pip3 install virtualenv \
    && pip3 install virtualenvwrapper \
    && pip3 install pandas

# # install django
# RUN pip3 install django

USER ${USER}
WORKDIR ${HOMEDIR}

我构建并标记以上内容如下:

docker build . --label validation --tag validation

然后我需要将.tar.gz文件添加到主目录。这个文件包含我维护的所有python脚本。此文件将经常更改。如果我将它添加到上面的dockerfile,每次更改.gz文件时都会安装python。这增加了大量的开发时间。作为一种解决方法,我尝试创建第二个dockerfile文件,该文件使用上面的图像作为基础,然后只需在其上添加.tar.gz文件。

FROM validation:latest

ARG USER=dsadmin
ARG HOMEDIR=/home/${USER}


ADD code/validation_utility.tar.gz ${HOMEDIR}/.


USER ${USER}
WORKDIR ${HOMEDIR}

之后,如果我运行docker image并执行ls,则文件夹中的所有文件都拥有games的所有者。

-rw-r--r--  1     501 games   35785 Nov  2 21:24 Validation_utility.py

为了解决上述问题,我在第二个docker文件中添加了以下行:

ADD code/validation_utility.tar.gz ${HOMEDIR}/.    
RUN chown -R ${USER}:${USER} ${HOMEDIR} \
        && chmod +x ${HOMEDIR}/Validation_utility.py

但我得到错误:

chown: changing ownership of '/home/dsadmin/Validation_utility.py': Operation not permitted

目标是有两个docker文件。用户将运行第一个docker文件来安装centos和python依赖项。第二个dockerfile将安装自定义python脚本。如果脚本发生更改,它们将再次运行第二个docker文件。这是考虑码头工人的正确方法吗?谢谢。

python docker
1个回答
0
投票

这是考虑码头工人的正确方法吗?

这是您问题的简单部分。是。您正在考虑构建Dockerfiles的正确方法,重用它们并保持图像构建的有效性。做得好。

至于你收到的错误,我没有信心回答为什么ADD命令会将你的tar.gz作为games用户解压缩。我对CentOS并不熟悉。这是问题的开始。 dsadmin作为普通的非特权用户,无法更改他不拥有的文件的所有权。由于这个非tarballed脚本由games拥有,因此chown命令失败。

我使用了你的Dockerfiles并在MacOS上遇到了同样的问题。

你可以解决这个问题,好吧,不要使用ADD。这很有趣,因为本地tarball提取是the one use case,Docker认为你应该更喜欢ADD而不是COPY。

COPY code/validation_utility.tar.gz ${HOMEDIR}/.
RUN tar -xvf validation_utility.tar.gz

正确地提取tarball,因为dsadmin当时是用户,所以内容由dsadmin正确拥有。

(一个更丑陋的路线可能是将USER切换到root来设置权限,然后将其设置回dsadmin。我认为这很icky,但它是一个选项。)

© www.soinside.com 2019 - 2024. All rights reserved.