目標(biāo)
- 實現(xiàn)將jenkins job :test的config.xml通過Dockerfile直接放入容器,并且保證test文件夾的owner是jenkins。
解決思路
- Q1:為了完成將文件放入容器旱物,我在Dockerfile中使用COPY指令,Dockerfile如下:
FROM jenkins:2.60.2
USER jenkins
COPY ./test /var/jenkins_home/jobs/
COPY ./test2 /var/jenkins_home/jobs/
USER jenkins
然后執(zhí)行docker-compose up -d
發(fā)現(xiàn)容器中竟然沒有這兩個文件同木,容器中為什么沒有這兩個文件歌馍?
- A1:查看官網(wǎng)后發(fā)現(xiàn),COPY指令使用沒有問題抹腿,然后換著copy其他文件都沒有copy進去岛请。發(fā)現(xiàn),每次
docker-compose up -d
log出來的信息都是容器已經(jīng)up to date
才意識到警绩,我們修改的Dockerfile從來都沒有被使用過崇败,一直都是使用原來使用Dockerfile創(chuàng)建的鏡像,采用docker rmi ***
之后肩祥,才發(fā)現(xiàn)重新build了新鏡像創(chuàng)建容器,終于copy進去后室。
Q2.發(fā)現(xiàn)卻在目標(biāo)文件的文件夾下面沒有testtest2目錄只有一堆目錄下的文件,這是為什么混狠?
-
A2:肯定是copy指令對copy目錄有特定的要求岸霹。這里的COPY指令和Linux的copy指令用法有所區(qū)別。Linux中的copy是通過參數(shù)對目錄的cp進行控制将饺,但是這里沒有使用參數(shù)贡避。因此運用自己的規(guī)則:
如果源目標(biāo)都是文件夾痛黎,那么COPY會將源目錄下的所有子文件或者目錄COPY到目標(biāo)目錄下(If <src> is a directory, the entire contents of the directory are copied, including filesystem metadata.)
改完后執(zhí)行
docker-compose up -d --build
發(fā)現(xiàn)任然是原來的樣子。
- Q3:為什么容器內(nèi)文件都修改了Dockercp的方式仍然不改變贸桶?并且也確實rebuild容器了舅逸?
- A3:認(rèn)真觀察
docker-compose up -d --build
的log,發(fā)現(xiàn)容器竟然是recreating而不是Creating皇筛。因此由于容器沒有被rm導(dǎo)致每次啟動都是用的原來的容器琉历。因此需要docker rm container
先將容器rm掉。之后成功水醋,但是權(quán)限仍然是root旗笔。
- Q4:為什么我們將用戶修改成了jenkins,jenkins用戶COPY之后的文件仍然是root拄踪?
- A4:查詢官網(wǎng)發(fā)現(xiàn)這句話
All new files and directories are created with a UID and GID of 0
說明使用這條指令會將文件owner變成root蝇恶。也就是跟你之前是否轉(zhuǎn)化了用戶沒有任何關(guān)系。
- Q5:那么我們能不能使用root用戶在Dockerfile中使用RUN chown修改一下COPY進來的用戶權(quán)限呢惶桐?
- A5:嘗試使用下面的Dockerfile
FROM jenkins:2.60.2
COPY ./jobs /var/jenkins_home/jobs
USER root
RUN chown -R jenkins /var/jenkins_home/jobs
發(fā)現(xiàn)chown完全沒有作用
- Q6:為什么明明是root用戶撮弧,卻沒有辦法chown修改owner?
- A6:首先我懷疑是root這個用戶還是沒有chown權(quán)限姚糊,但是查過Linux文檔發(fā)現(xiàn)贿衍,只有root有chown的權(quán)限。我就進入容器執(zhí)行RUN的指令發(fā)現(xiàn)成功了救恨。
- Q7:那么為什么在容器中執(zhí)行chown就能成功在Dockerfile就不行贸辈?
- A7:首先我懷疑執(zhí)行RUN的用戶并不是root,因為在官網(wǎng)說
The RUN instruction will execute any commands in a new layer on top of the current image
肠槽,所以我在RUN這里先執(zhí)行了whoami
發(fā)現(xiàn)用戶確實是root,既然這個test目錄的owner是root擎淤,那么我在Dockerfile中
FROM jenkins:2.60.2
COPY ./jobs /var/jenkins_home/jobs
USER root
RUN rm -rf /var/jenkins_home/jobs/test
發(fā)現(xiàn)無法rm,說明出現(xiàn)這個問題和chown沒有任何關(guān)系秸仙,只能說明在Dockerfile中COPY的文件owner是root嘴拢,并且在Dockerfile中USER root,此時RUN中執(zhí)行的任何root能對這個文件的操作都不能執(zhí)行寂纪,但是在容器內(nèi)部可以席吴。也就是說COPY進來的文件OWNER是容器中的root而不是Dockerfile中的root,實在是解決不了弊攘,求解抢腐?姑曙?襟交??伤靠?捣域?
---> 因為問題沒有解決 我明天會繼續(xù)研究 今天先寫到這里