Skip to content
This repository was archived by the owner on Jun 13, 2019. It is now read-only.
This repository was archived by the owner on Jun 13, 2019. It is now read-only.

Umbrella App mix docker.build and mix docker.release each sub-app using separate Dockerfile.build.sub_app<N> and Dockerfile.release.sub_app<N> #20

@yeongsheng-tan

Description

@yeongsheng-tan

I have a top level umbrella_app with 2 sub-apps: sub_app1 and sub_app2.
I would like to carry out mix docker.build and mix docker.release for each sub-app separately, each using a different Dockerfile.build.sub_app1, Dockerfile.build.sub_app2 and Dockerfile.release.sub_app1 and Dockerfile.release.sub_app2.

In each of the Dockerfile.build.sub_app1 and Dockerfile.build.sub_app2, I would like to invoke a different mix release --profile=<sub_app>:prod

How could this be achieved? Is this a correct practice?

I managed to do so by creating custom Dockerfile.build for each sub-app within which I invoke mix release --profile=<sub_app>:prod by editing my umbrella project config/config.exs config section as such:

# config :mix_docker,
#   image: "app/sub_app1",
#   dockerfile_build: "./Dockerfile.build.sub_app1",
#   dockerfile_release: "./Dockerfile.release.sub_app1"

config :mix_docker,
  image: "app/sub_app2",
  dockerfile_build: "./Dockerfile.build.sub_app2",
  dockerfile_release: "./Dockerfile.release.sub_app2"

I then manually edit and toggle on/off each section as I trigger mix docker.build for each case.

==> Writing tarball to _build/prod/rel/sub_app1/releases/<version>/sub_app1.tar.gz
==> Updating tarball
==> Tarball updated!
==> Release successfully built!
    You can run it in one of the following ways:
      Interactive: _build/prod/rel/sub_app1/bin/sub_app1 console
      Foreground: _build/prod/rel/sub_app1/bin/sub_app1 foreground
      Daemon: _build/prod/rel/sub_app1/bin/sub_app1 start
 ---> a2da9353baed
Removing intermediate container 35a7361860a6
Successfully built a2da9353baed
Docker image app/sub_app1:build has been successfully created

However, mix docker.release always fails as it expects my tarball to be created at /opt/app/_build/prod/rel/umbrella_app/releases//umbrella_app.tar.gz

16:17:45.630 [debug] $ docker create --name mix_docker-980782 app/sub_app1:build
b9f43d3a25a19f0ea43e0bd06de4a66f07171aadf8a2c551eef7c3841b6fe77d

16:17:45.719 [debug] $ docker cp mix_docker-980782:/opt/app/_build/prod/rel/umbrella_app/releases/<version>/umbrella_app.tar.gz umbrella_app.tar.gz
Error response from daemon: lstat /var/lib/docker/overlay/e129f7d73db871107dbd7b69832632150768a05098bc60bc5f479a18fec97307/merged/opt/app/_build/prod/rel/umbrella_app/releases/<version>/umbrella_app.tar.gz: no such file or directory
** (MatchError) no match of right hand side value: {%IO.Stream{device: :standard_io, line_or_bytes: :line, raw: false}, 1}
    (mix_docker) lib/mix_docker.ex:179: MixDocker.system!/2
    (mix_docker) lib/mix_docker.ex:36: anonymous fn/4 in MixDocker.release/1
    (mix_docker) lib/mix_docker.ex:33: MixDocker.release/1
    (mix) lib/mix/task.ex:294: Mix.Task.run_task/3
    (mix) lib/mix/cli.ex:58: Mix.CLI.run_task/2

Where it should be doing instead in order to work correctly:

docker cp mix_docker-980782:/opt/app/_build/prod/rel/sub_app1/releases/<version>/sub_app1.tar.gz sub_app1.tar.gz

However, the current implementation defaults app bundle create using the umbrella_app being the app_name(). Where it should inspect and detect from the release profile info for the app name to use.

Is my understanding correct? Am I using the package correctly?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions