在Dockerfile上更改ImageMagick策略

7
最近 ImageMagick 发生了变化,导致从 pdf 转换为 png 的过程出现了问题。经过我的调查,发现问题出在 policy.xml 文件的以下一行:
<policy domain="coder" rights="none" pattern="PDF" />

需要将此更改为:

<policy domain="coder" rights="read|write" pattern="PDF" />

(注意:我之前没有出现过这个问题。)

我可以在我的个人电脑上更改它,但现在我需要在通过Dockerfile配置的Docker容器中更改它。我该怎么做?

我尝试使用环境变量,但没有成功。你可以在这里看到我的dockerfile:

https://github.com/VivianePons/public-notebooks

谢谢你的帮助。


您可以发出COPY命令将“policy.xml”放置在正确的位置。或者,您可以在“policy.xml”上运行“sed ...”。 - Luca De Feo
确实,拷贝起作用了,谢谢。 - Viviane
2个回答

14
这个对你的Dockerfile的修改有效。
ARG imagemagic_config=/etc/ImageMagick-6/policy.xml

RUN if [ -f $imagemagic_config ] ; then sed -i 's/<policy domain="coder" rights="none" pattern="PDF" \/>/<policy domain="coder" rights="read|write" pattern="PDF" \/>/g' $imagemagic_config ; else echo did not see file $imagemagic_config ; fi

如果我手动运行它,它可以工作。但是在 Dockerfile 中,我会得到 [[: not found 的错误,因为 [[ 是 bash 内置的命令,而 RUN 命令似乎不会通过实际的 bash 执行它。 - Lena Schimmel
@LenaSchimmel 尝试使用单个 [ 而不是双个 [[。 - Scott Stensland

6

运行时绑定挂载

在运行时(docker run),使用绑定挂载卷来覆盖容器内的policy.xml

在Docker Hub上官方Nginx镜像的如何使用此映像部分中可以找到一个简单明了的例子。

docker run --name some-nginx -v /some/content:/usr/share/nginx/html -d nginx

这里,-v标志是您的绑定挂载。 -v /some/content:/usr/share/nginx/html表示“用主机上/some/content的内容替换容器中的/usr/share/nginx/html”。对于用户而言,如果/some/content具有作为容器中nginx.conf确定的默认主页的index.html或其他默认主页,则Nginx将不需要进行任何配置更改,因为默认的Nginx配置已经在该文件系统位置查找index.html。

注意:绑定挂载不是可添加的。 镜像上的目录将被完全替换为正在挂载的内容。

Dockerfile COPY

或者在构建时(docker build)在您的Dockerfile中使用COPY将更新的policy.xml直接嵌入到容器中,无需绑定挂载。

COPY ./path/to/policy.xml /path/in/docker/image/policy.xml


1
这个问题并没有明确说明,但是通过查看GitHub存储库,可以清楚地看到目标是拥有一个与MyBinder.org兼容的Docker镜像。在这种情况下,运行时绑定挂载不可用。 - Luca De Feo
好发现,重要细节。 - bluescores

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