小编Tob*_*mer的帖子

如何为Java应用程序构建docker容器

我想要做的是为我的Java应用程序构建一个docker镜像,但对于大多数编译语言,以下注意事项应该是正确的.

问题

在我的构建服务器上,我想为我的应用程序生成一个docker镜像作为可交付成果.为此,我必须使用一些构建工具(通常是Gradle,Maven或Ant)编译应用程序,然后将创建的JAR文件添加到docker镜像.因为我希望docker镜像只执行JAR文件,我当然会从已安装Java的基本映像开始.

有三种方法可以做到这一点:

让构建工具控制进程

在这种情况下,我的构建工具控制整个过程.因此它准备了JAR文件,在创建JAR之后,它调用Docker来创建映像.这是因为事先创建了JAR,Docker可能会忘记创建JAR所需的构建过程.

但我的Dockerfile不再是独立的.这取决于在Docker之外发生的步骤.在我的Dockerfile中,我将有一个COPY或者ADD声明应该将JAR文件复制到图像.事先未创建jar时,此语句将失败.所以只是执行Dockerfile可能不起作用.如果要与使用Dockerfile构建的服务集成(如DockerHub上的自动构建功能),则会出现问题.

让Docker控制构建

在这种情况下,创建映像的所有必要步骤都将添加到Dockerfile中,因此只需执行Docker构建即可创建映像.

这种方法的主要问题是无法添加应该在正在创建的docker镜像之外执行的Dockerfile命令.这意味着我必须将我的源代码和构建工具添加到docker镜像并在图像中构建我的JAR文件.这将导致我的图像比必须更大,因为添加的所有文件在运行时都是不必要的.这也将为我的图像添加额外的图层.

编辑:

正如@adrian-mouat所指出的,如果我要添加源代码,构建应用程序并在一个RUN语句中删除源代码,我可以避免向Docker镜像添加不必要的文件和图层.这意味着要创造一些疯狂的链式命令.

两个独立的构建

在这种情况下,我们将构建分为两部分:首先,我们使用构建工具创建JAR文件,然后将其上传到存储库(Maven或Ivy存储库).然后,我们触发一个单独的Docker构建,只是从存储库添加JAR文件.

结论

在我看来,更好的方法是让构建工具控制流程.这将产生干净的泊坞窗图像,因为图像是我们想要提供的,这是非常重要的.为避免可能无法正常工作的Dockerfile,应将其作为构建的一部分创建.因此,没有人会不小心使用它来开始破坏构建.

但这不允许我与DockerHub集成.

我还有另一种方法吗?

java gradle maven docker dockerfile

43
推荐指数
2
解决办法
4万
查看次数

Spring Cloud Zuul Proxy背后的Spring OAuth授权服务器

我目前正在开发基于微服务架构的应用程序.我们使用使用Spring Cloud Netfix的Zuul Server实现的API网关将请求路由到我们的微服务.

要实现我们所有服务的单点登录,我目前正在使用Spring Cloud Security设置OAuth2服务器.服务器基本上只是在Dave Syer的Repo中实现的复制和过去:https://github.com/dsyer/spring-security-angular/tree/master/oauth2/authserver

主要区别在于我想通过Zuul代理将请求路由到我的OAuth服务器.这样我就不必直接暴露我的OAuth服务器,并可以动态添加和删除Login Server.

问题是我不了解如何正确配置此设置.当我尝试访问OAuth服务器上的受保护资源时,我将转发到登录页面.这当然是预期的.但我无法弄清楚如何设置转发时使用的主机名和端口.我想要发生的是服务器转发到Zuul服务器上的端点,该端点将被代理回到OAuth服务器.(Zuul API-Gateway应该是客户端与之交谈的唯一服务器.其他所有内容都将被隐藏.)

因为它是主机和端口从读HttpServletRequestLoginUrlAuthenticationEntryPoint.但是服务器看到的请求是Zuul代理发送的请求.所以我被转发到内部IP而不是代理端点.

我尝试将登录页面WebSecurityConfigurerAdapter.configure(HttpSecurity)的URL设置为我的Zuul代理的绝对URL.但这只是导致我的应用程序抱怨太多的重定向.(可能会在那里引起循环.)

设置它的最佳方法是什么?

  • 我是否必须通过覆盖bean来实现某种自己的转发策略?
  • 是否有我缺少的配置选项?
  • 我的想法本身是错的吗?(在他如何避免与Zuul重定向到另一个主机的回答中 Dave Syer说你通常不代理这个,但不解释原因.)

java spring-security spring-cloud netflix-zuul

28
推荐指数
1
解决办法
2万
查看次数

Docker Volume:Docker Volume无法在Amazon Linux上正确安装

我目前正在尝试使用ansible将docker注册表部署到Amazon ec2.我的食谱中的任务看起来像这样:

- name: run docker registry container
  docker:
    image: registry
    name: docker-registry
    state: reloaded
    env:
      SETTINGS_FLAVOR: local
      STORAGE_PATH: /opt/docker-registry
      SEARCH_BACKEND: sqlalchemy
    volumes:
    - "/data/docker-registry-server/opt/docker-registry:/opt/docker-registry"
    ports:
    - "5000:5000"
Run Code Online (Sandbox Code Playgroud)

如您所见,注册表部署为docker中的容器.这在某种程度上起作用.容器正确启动,但卷未正确安装.我通过运行检查了这个:

docker exec -t -i docker-registry touch /opt/docker-registry/touch.me
Run Code Online (Sandbox Code Playgroud)

这将在应安装卷的文件夹中的容器中创建一个新文件.所以这个文件应该出现在主机上,/data/docker-registry-server/opt/docker-registry但事实并非如此.

运行时docker inspect docker-registry我得到这个结果:

[{
"AppArmorProfile": "",
"Args": [],
"Config": {
    "AttachStderr": false,
    "AttachStdin": false,
    "AttachStdout": false,
    "Cmd": [
        "docker-registry"
    ],
    "CpuShares": 0,
    "Cpuset": "",
    "Domainname": "",
    "Entrypoint": null,
    "Env": [
        "SETTINGS_FLAVOR=local",
        "SEARCH_BACKEND=sqlalchemy",
        "STORAGE_PATH=/opt/docker-registry",
        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
        "DOCKER_REGISTRY_CONFIG=/docker-registry/config/config_sample.yml"
    ],
    "ExposedPorts": {
        "5000/tcp": …
Run Code Online (Sandbox Code Playgroud)

ansible docker

8
推荐指数
1
解决办法
1703
查看次数