java - Dockerfile 特殊转义符号
问题描述
当我使用带有“--build-arg”的命令来构建 docker-image 时,传入参数中的空格被替换为加号。
我的maven pom.xml:
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.13</version>
<configuration>
<repository>192.168.1.200/library/${project.artifactId}</repository>
<tag>${project.version}</tag>
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
<JVM_OPTS>-Xms300m -Xmx300m</JVM_OPTS>
</buildArgs>
</configuration>
</plugin>
我的 Dockerfile:
FROM 192.168.1.200/library/openjdk:8-jdk-alpine
MAINTAINER gaojiayiner@163.com
LABEL version="1.0.0"
RUN mkdir -p /project && mkdir -p /data
ENV workdir /project
WORKDIR $workdir
ARG JAR_FILE
ARG JVM_OPTS
ENV jvm $JVM_OPTS
COPY target/${JAR_FILE} /project/demo.jar
EXPOSE 8080
ENTRYPOINT ["sh","-c","java -jar /project/demo.jar $0 $@"]
终端执行记录:
[root@localhost docker-java]# mvn clean package dockerfile:build
[root@localhost docker-java]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.1.200/library/demo 0.0.1-SNAPSHOT 13373a4761a1 3 seconds ago 131MB
192.168.1.200/library/openjdk 8-jdk-alpine a3562aa0b991 14 months ago 105MB
[root@localhost docker-java]# docker run -d 13373a4761a1
d0b5ce9392b12505419d5648332f204dc3d59327efd389c27a950aa0d1daba35
[root@localhost docker-java]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d0b5ce9392b1 13373a4761a1 "sh -c 'java -jar /p…" 4 seconds ago Up 4 seconds 8080/tcp reverent_kirch
[root@localhost docker-java]# docker exec -it d0b5ce9392b1 sh
/project # env
jvm=-Xms300m+-Xmx300m
JAVA_ALPINE_VERSION=8.212.04-r0
HOSTNAME=d0b5ce9392b1
你可以看到代码jvm=-Xms300m+-Xmx300m
。我该如何解决这个问题?
解决方案
您需要spotify/dockerfile-maven
自己重新编译,因为修复此错误的拉取请求尚未合并/接受。
参见“ spotify/dockerfile-maven
PR 350 ”
它指出了罪魁祸首:plugin/dockerfile/BuildMojo.java#encodeBuildParam
private static String encodeBuildParam(Object buildParam) throws MojoExecutionException {
try {
return URLEncoder.encode(new Gson().toJson(buildParam), "utf-8");
} catch (UnsupportedEncodingException e) {
throw new MojoExecutionException("Could not build image", e);
}
}
事实上,我们可以在这里阅读(类
URLEncoder
)用加号“ ”URLEncoder
替换空格字符“ ”。
+
编码后,我添加了一个替换以
+
用空格替换符号:编码后,所有加号都已经编码为/0x2B
,所以剩下的就是来自空格的加号。
修复将包括:
return URLEncoder.encode(
new Gson().toJson(buildParam), StandardCharsets.UTF_8.toString()
).replace('+', ' ');
^^^^^^^^^^^^^^^^^^^
推荐阅读
- javascript - 如何使用 Sinon & Chai 测试延迟后重试的功能?
- excel - 查找是否有 2 个单元格匹配并替换其中 1 个单元格中的文本
- java - 如何在超级构造函数中测试对象初始化?
- python - 使 python 文件成为可执行文件
- python - Docker容器在MacOs上退出?
- javascript - 在导航中移动文本和图像
- swift - Swift/FireStore - 按日期查询的最佳方式
- typescript - 找不到 ./Page - 字段“浏览器”不包含有效的别名配置故事书
- flutter - 调试器遇到了这个奇怪的错误。我应该如何解释这个错误/警告/日志?
- c++ - 如果我在没有新表达式的情况下直接调用 operator new 并将返回指针类型转换为安全的?