如何在Dockerfile中下载和解压文件

28

所以,我已经有一个可以工作的方案,但我想改变立即下载文件并解压文件的方式:

Dockerfile
FROM wordpress:fpm

# Copying themes from local  
COPY  ./wordpress/ /var/www/html/wp-content/themes/wordpress/    
RUN chmod -R 777 /var/www/html/    

我怎样才能立即从网站下载文件并解压到相应的文件夹中?

docker-compose.yml
wordpress:
build: . 
links:
  - db:mysql
nginx:
image: raulr/nginx-wordpress 
links:
  - wordpress
ports:
 - "8080:80"
 volumes_from:
 - wordpress
db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: qwerty 

我尝试过:

#install unzip and wget
RUN \
apt-get update && \
apt-get install unzip wget -y && \
rm -rf /var/lib/apt/lists/*

RUN wget -O /var/www/html/type.zip http://wp-templates.ru/download/2405 \
&& unzip '/var/www/html/type.zip' -d /var/www/html/wp-content/themes/ && rm 
/var/www/html/type.zip || true;

1
当您运行该命令时会发生什么?我会删除 || true 部分,因为它会抑制任何失败,而这并不是您真正想要的。 - David Maze
1
尝试使用CMD而不是RUN,当Docker加载并调用entrypoint时,CMD将出现一次。 - H. Bloch
3个回答

6

Docker文档中发现了有关远程压缩文件的更多指导。

由于镜像大小很重要,强烈不建议使用ADD从远程URL获取软件包;您应该改用curl或wget。这样,您可以在提取文件后删除不再需要的文件,并且不必在镜像中添加另一层。例如,您应该避免执行以下操作:

ADD https://example.com/big.tar.xz /usr/src/things/
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
RUN make -C /usr/src/things all

相反,做以下操作:

RUN mkdir -p /usr/src/things \
    && curl -SL https://example.com/big.tar.xz \
    | tar -xJC /usr/src/things \
    && make -C /usr/src/things all

看起来他们改变了主意。引用的段落已被删除,而在https://docs.docker.com/develop/develop-images/instructions/#add-or-copy上现在可以找到这个:使用ADD比使用wget和tar手动添加文件更好,因为它可以确保更精确的构建缓存。 - undefined

5

最好使用多阶段 Docker 构建。您需要启用最新版本的 Docker 和 BuildKit。然后可以按照以下方式执行:

# syntax=docker/dockerfile:1
from alpine:latest as unzipper
apk add unzip wget curl
RUN mkdir /opt/ ; \
  curl <some-url> | tar xvzf - -C /opt

FROM wordpress:fpm
COPY  --from unzipper /opt/ /var/www/html/wp-content/themes/wordpress/    

如果已经有一个Docker镜像包含你需要的东西,那就更好了,你只需要'copy --from'这一行并提供镜像名称即可。

最后在第一阶段中不必担心任何混乱,因为它会在构建完成时被丢弃,所以它是alpine和不使用no-cache是无关紧要的,安装的任何软件包都不会出现在最终镜像中。


1
为了避免让其他人混淆:根据Docker文档,--from语法需要使用=符号,即--from=unzipper。我需要加上它才能使上面的片段运行。 - Fgop

5

Dockerfile具有复制和提取.tar.gz文件的“本地命令”。

因此,您可以将档案类型从.zip更改为.tar.gz(也许在将来版本中也会支持zip格式,我不确定),并使用ADD而不是COPY

阅读更多关于ADD的内容


6
问题是如何将ADD与wget结合使用,因为ADD只能解压缩__本地__文件。 - David Dale
4
“ADD” 命令只能复制、提取或下载,而不能混合,这太荒谬了。如果是我,我会创建三个意思不同的动词。(抱歉发牢骚) - lapo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接