我正在使用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文件。这是考虑码头工人的正确方法吗?谢谢。
答案 0 :(得分: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
。我认为这很蹩脚,但它是一个选项。)