如何对单个应用使用多个dockerfiles

2024-10-01 17:23:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是一个centos的基本映像,并用下面的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}

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

^{pr2}$

然后我需要在主目录中添加一个.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文件。这是对多克的看法吗?谢谢您。


Tags: install文件dockerrundockerfilepip3argtar
1条回答
网友
1楼 · 发布于 2024-10-01 17:23:28

Is that the right way to think about docker?

这是你问题中最简单的部分。对。您正在考虑构建dockerfile的正确方法,重用它们,并保持图像构建的效率。干得好。在

至于您收到的错误,我不太有信心回答为什么ADD命令会取消您的tarball焦油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是当时的用户,因此内容将正确地归{}所有。在

(更糟糕的方法可能是将用户切换到root用户以设置权限,然后将其设置回dsadmin。我觉得这很恶心,但这是个选择。)

相关问题 更多 >

    热门问题