mirror of
https://github.com/EpicMorg/docker-scripts.git
synced 2025-01-24 20:48:18 +03:00
CVE FIXES
This commit is contained in:
parent
047473907d
commit
5de0768ec8
3
Makefile
3
Makefile
@ -418,6 +418,9 @@ ecosystem-debian-bookworm-images:
|
||||
cd `pwd`/linux/ecosystem/epicmorg/debian/12-bookworm/slim && pwd && make build && make deploy
|
||||
cd `pwd`/linux/ecosystem/epicmorg/debian/12-bookworm/main && pwd && make build && make deploy
|
||||
cd `pwd`/linux/ecosystem/epicmorg/debian/12-bookworm/develop && pwd && make build && make deploy
|
||||
make ecosystem-debian-bookworm-jdk-images
|
||||
|
||||
ecosystem-debian-bookworm-jdk-images:
|
||||
cd `pwd`/linux/ecosystem/epicmorg/debian/12-bookworm/jdk6 && pwd && make build && make deploy
|
||||
cd `pwd`/linux/ecosystem/epicmorg/debian/12-bookworm/jdk7 && pwd && make build && make deploy
|
||||
cd `pwd`/linux/ecosystem/epicmorg/debian/12-bookworm/jdk8 && pwd && make build && make deploy
|
||||
|
46
linux/ecosystem/atlassian/bitbucket/8/8.19.6/Dockerfile
Normal file
46
linux/ecosystem/atlassian/bitbucket/8/8.19.6/Dockerfile
Normal file
@ -0,0 +1,46 @@
|
||||
FROM epicmorg/debian:bookworm-jdk11
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
ARG BITBUCKET_VERSION=8.19.6
|
||||
ARG DOWNLOAD_URL=https://product-downloads.atlassian.com/software/stash/downloads/atlassian-bitbucket-${BITBUCKET_VERSION}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/display/BitbucketServer/Bitbucket+Server+home+directory
|
||||
ENV BITBUCKET_HOME /var/atlassian/application-data/bitbucket
|
||||
ENV BITBUCKET_INSTALL_DIR /opt/atlassian/bitbucket
|
||||
|
||||
VOLUME ["${BITBUCKET_HOME}"]
|
||||
WORKDIR $BITBUCKET_HOME
|
||||
|
||||
# Expose HTTP and SSH ports
|
||||
EXPOSE 7990
|
||||
EXPOSE 7999
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --allow-downgrades git/bookworm
|
||||
|
||||
RUN mkdir -p ${BITBUCKET_INSTALL_DIR} \
|
||||
&& curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "${BITBUCKET_INSTALL_DIR}" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${BITBUCKET_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^# umask/umask/' ${BITBUCKET_INSTALL_DIR}/bin/_start-webapp.sh && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
||||
COPY entrypoint.sh /entrypoint.sh
|
@ -0,0 +1,47 @@
|
||||
FROM epicmorg/debian:bookworm-jdk11
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
ARG BITBUCKET_VERSION=8.19.6
|
||||
ARG DOWNLOAD_URL=https://product-downloads.atlassian.com/software/stash/downloads/atlassian-bitbucket-${BITBUCKET_VERSION}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/display/BitbucketServer/Bitbucket+Server+home+directory
|
||||
ENV BITBUCKET_HOME /var/atlassian/application-data/bitbucket
|
||||
ENV BITBUCKET_INSTALL_DIR /opt/atlassian/bitbucket
|
||||
|
||||
VOLUME ["${BITBUCKET_HOME}"]
|
||||
WORKDIR $BITBUCKET_HOME
|
||||
|
||||
# Expose HTTP and SSH ports
|
||||
EXPOSE 7990
|
||||
EXPOSE 7999
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --allow-downgrades git/bookworm
|
||||
|
||||
RUN mkdir -p ${BITBUCKET_INSTALL_DIR} \
|
||||
&& curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "${BITBUCKET_INSTALL_DIR}" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${BITBUCKET_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^# umask/umask/' ${BITBUCKET_INSTALL_DIR}/bin/_start-webapp.sh && \
|
||||
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
||||
COPY entrypoint.sh /entrypoint.sh
|
@ -0,0 +1,46 @@
|
||||
FROM epicmorg/debian:bookworm-jdk17
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
ARG BITBUCKET_VERSION=8.19.6
|
||||
ARG DOWNLOAD_URL=https://product-downloads.atlassian.com/software/stash/downloads/atlassian-bitbucket-${BITBUCKET_VERSION}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/display/BitbucketServer/Bitbucket+Server+home+directory
|
||||
ENV BITBUCKET_HOME /var/atlassian/application-data/bitbucket
|
||||
ENV BITBUCKET_INSTALL_DIR /opt/atlassian/bitbucket
|
||||
|
||||
VOLUME ["${BITBUCKET_HOME}"]
|
||||
WORKDIR $BITBUCKET_HOME
|
||||
|
||||
# Expose HTTP and SSH ports
|
||||
EXPOSE 7990
|
||||
EXPOSE 7999
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --allow-downgrades git/bookworm
|
||||
|
||||
RUN mkdir -p ${BITBUCKET_INSTALL_DIR} \
|
||||
&& curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "${BITBUCKET_INSTALL_DIR}" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${BITBUCKET_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^# umask/umask/' ${BITBUCKET_INSTALL_DIR}/bin/_start-webapp.sh && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
||||
COPY entrypoint.sh /entrypoint.sh
|
50
linux/ecosystem/atlassian/bitbucket/8/8.19.6/Makefile
Normal file
50
linux/ecosystem/atlassian/bitbucket/8/8.19.6/Makefile
Normal file
@ -0,0 +1,50 @@
|
||||
PIP_BREAK_SYSTEM_PACKAGES=1
|
||||
|
||||
all: app
|
||||
|
||||
app:
|
||||
make build
|
||||
make deploy
|
||||
make clean
|
||||
|
||||
build:
|
||||
make pip
|
||||
python3 kaniko-build.py --version
|
||||
|
||||
dry:
|
||||
make dry-run
|
||||
|
||||
test:
|
||||
make dry-run
|
||||
|
||||
dry-run:
|
||||
python3 kaniko-build.py --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug --dry-run
|
||||
|
||||
pip:
|
||||
rm -rf /usr/lib/python3.6/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.7/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.8/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.13/EXTERNALLY-MANAGED
|
||||
pip3 install -r requirements.txt
|
||||
pip install -r requirements.txt
|
||||
|
||||
build-compose:
|
||||
docker-compose build --compress --parallel --progress plain
|
||||
|
||||
deploy:
|
||||
make pip
|
||||
python3 kaniko-build.py --deploy --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug
|
||||
|
||||
deploy-compose:
|
||||
docker-compose push
|
||||
|
||||
clean:
|
||||
docker container prune -f
|
||||
docker image prune -f
|
||||
docker network prune -f
|
||||
docker volume prune -f
|
||||
docker system prune -af
|
216
linux/ecosystem/atlassian/bitbucket/8/8.19.6/README.md
Normal file
216
linux/ecosystem/atlassian/bitbucket/8/8.19.6/README.md
Normal file
@ -0,0 +1,216 @@
|
||||
![Atlassian Bitbucket Server](https://www.atlassian.com/dam/wac/legacy/bitbucket_logo_landing.png)
|
||||
|
||||
Bitbucket Server is an on-premises source code management solution for Git that's secure, fast, and enterprise grade. Create and manage repositories, set up fine-grained permissions, and collaborate on code - all with the flexibility of your servers.
|
||||
|
||||
Learn more about Bitbucket Server: <https://www.atlassian.com/software/bitbucket/server>
|
||||
|
||||
# Overview
|
||||
|
||||
This Docker container makes it easy to get an instance of Bitbucket up and running.
|
||||
|
||||
** We strongly recommend you run this image using a specific version tag instead of latest. This is because the image referenced by the latest tag changes often and we cannot guarantee that it will be backwards compatible. **
|
||||
|
||||
# Quick Start
|
||||
|
||||
For the `BITBUCKET_HOME` directory that is used to store the repository data
|
||||
(amongst other things) we recommend mounting a host directory as a [data volume](https://docs.docker.com/engine/tutorials/dockervolumes/#/data-volumes), or via a named volume if using a docker version >= 1.9.
|
||||
|
||||
Volume permission is managed by entry scripts. To get started you can use a data volume, or named volumes. In this example we'll use named volumes.
|
||||
|
||||
$> docker volume create --name bitbucketVolume
|
||||
$> docker run -v bitbucketVolume:/var/atlassian/application-data/bitbucket --name="bitbucket" -d -p 7990:7990 -p 7999:7999 atlassian/bitbucket-server
|
||||
|
||||
Note that this command can substitute folder paths with named volumes.
|
||||
|
||||
Start Atlassian Bitbucket Server:
|
||||
|
||||
$> docker run -v /data/bitbucket:/var/atlassian/application-data/bitbucket --name="bitbucket" -d -p 7990:7990 -p 7999:7999 atlassian/bitbucket-server
|
||||
|
||||
**Success**. Bitbucket is now available on [http://localhost:7990](http://localhost:7990)*
|
||||
|
||||
Please ensure your container has the necessary resources allocated to it.
|
||||
We recommend 2GiB of memory allocated to accommodate both the application server
|
||||
and the git processes.
|
||||
See [Supported Platforms](https://confluence.atlassian.com/display/BitbucketServer/Supported+platforms) for further information.
|
||||
|
||||
|
||||
_* Note: If you are using `docker-machine` on Mac OS X, please use `open http://$(docker-machine ip default):7990` instead._
|
||||
|
||||
## Reverse Proxy Settings
|
||||
|
||||
If Bitbucket is run behind a reverse proxy server as [described here](https://confluence.atlassian.com/bitbucketserver/proxying-and-securing-bitbucket-server-776640099.html),
|
||||
then you need to specify extra options to make bitbucket aware of the setup. They can be controlled via the below
|
||||
environment variables.
|
||||
|
||||
### Bitbucket Server 5.0 +
|
||||
|
||||
Due to the migration to Spring Boot in 5.0, there are changes to how you set up Bitbucket to run behind a reverse proxy.
|
||||
|
||||
In this example, we'll use an environment file. You can also do this via [specifying each environment variable](https://docs.docker.com/engine/reference/run/#env-environment-variables) via the `-e` argument in `docker run`.
|
||||
|
||||
#### secure-bitbucket.env
|
||||
```
|
||||
SERVER_SECURE=true
|
||||
SERVER_SCHEME=https
|
||||
SERVER_PROXY_PORT=443
|
||||
SERVER_PROXY_NAME=<Your url here>
|
||||
```
|
||||
|
||||
Then you run Bitbucket as usual
|
||||
|
||||
`docker run -v bitbucketVolume:/var/atlassian/application-data/bitbucket --name="bitbucket" -d -p 7990:7990 -p 7999:7999 --env-file=/path/to/env/file/secure-bitbucket.env atlassian/bitbucket-server:5.0`
|
||||
|
||||
### Bitbucket Server < 5.0
|
||||
|
||||
To set the reverse proxy arguments, you specify the following as environment variables in the `docker run` command
|
||||
|
||||
* `CATALINA_CONNECTOR_PROXYNAME` (default: NONE)
|
||||
|
||||
The reverse proxy's fully qualified hostname.
|
||||
|
||||
* `CATALINA_CONNECTOR_PROXYPORT` (default: NONE)
|
||||
|
||||
The reverse proxy's port number via which bitbucket is accessed.
|
||||
|
||||
* `CATALINA_CONNECTOR_SCHEME` (default: http)
|
||||
|
||||
The protocol via which bitbucket is accessed.
|
||||
|
||||
* `CATALINA_CONNECTOR_SECURE` (default: false)
|
||||
|
||||
Set 'true' if CATALINA\_CONNECTOR\_SCHEME is 'https'.
|
||||
|
||||
## JVM Configuration (Bitbucket Server 5.0 + only)
|
||||
|
||||
If you need to override Bitbucket Server's default memory configuration or pass additional JVM arguments, use the environment variables below
|
||||
|
||||
* `JVM_MINIMUM_MEMORY` (default: 512m)
|
||||
|
||||
The minimum heap size of the JVM
|
||||
|
||||
* `JVM_MAXIMUM_MEMORY` (default: 1024m)
|
||||
|
||||
The maximum heap size of the JVM
|
||||
|
||||
* `JVM_SUPPORT_RECOMMENDED_ARGS` (default: NONE)
|
||||
|
||||
Additional JVM arguments for Bitbucket Server, such as a custom Java Trust Store
|
||||
|
||||
## Application Mode Settings (Bitbucket Server 5.0 + only)
|
||||
|
||||
This docker image can be run as a [Smart Mirror](https://confluence.atlassian.com/bitbucketserver/smart-mirroring-776640046.html) or as part of a [Data Center](https://confluence.atlassian.com/enterprise/bitbucket-data-center-668468332.html) cluster.
|
||||
You can specify the following properties to start Bitbucket as a mirror or as a Data Center node:
|
||||
|
||||
* `ELASTICSEARCH_ENABLED` (default: true)
|
||||
|
||||
Set 'false' to prevent Elasticsearch from starting in the container. This should be used if Elasticsearch is running remotely, e.g. for if Bitbucket is running in a Data Center cluster
|
||||
|
||||
* `APPLICATION_MODE` (default: default)
|
||||
|
||||
The mode Bitbucket will run in. This can be set to 'mirror' to start Bitbucket as a Smart Mirror. This will also disable Elasticsearch even if `ELASTICSEARCH_ENABLED` has not been set to 'false'.
|
||||
|
||||
* `HAZELCAST_NETWORK_MULTICAST` (default: false)
|
||||
|
||||
Data Center: Set 'true' to enable Bitbucket to find new Data Center cluster members via multicast. `HAZELCAST_NETWORK_TCPIP` should not be specified when using this setting.
|
||||
|
||||
* `HAZELCAST_NETWORK_TCPIP` (default: false)
|
||||
|
||||
Data Center: Set 'true' to enable Bitbucket to find new Data Center cluster members via TCPIP. This setting requires `HAZELCAST_NETWORK_TCPIP_MEMBERS` to be specified. `HAZELCAST_NETWORK_MULTICAST` should not be specified when using this setting.
|
||||
|
||||
* `HAZELCAST_NETWORK_TCPIP_MEMBERS`
|
||||
|
||||
Data Center: List of members that Hazelcast nodes should connect to when HAZELCAST_NETWORK_TCPIP is 'true'
|
||||
|
||||
* `HAZELCAST_GROUP_NAME`
|
||||
|
||||
Data Center: Specifies the cluster group the instance should join.
|
||||
|
||||
* `HAZELCAST_GROUP_PASSWORD`
|
||||
|
||||
Data Center: The password required to join the specified cluster group.
|
||||
|
||||
To run Bitbucket as part of a Data Center cluster, create a Docker network and assign the Bitbucket container a static IP.
|
||||
|
||||
Note: Docker networks may support multicast, however the below example shows configuration using TCPIP.
|
||||
|
||||
$> docker network create --driver bridge --subnet=172.18.0.0/16 myBitbucketNetwork
|
||||
$> docker run --network=myBitbucketNetwork --ip=172.18.1.1 -e ELASTICSEARCH_ENABLED=false \
|
||||
-e HAZELCAST_NETWORK_TCPIP=true -e HAZELCAST_NETWORK_TCPIP_MEMBERS=172.18.1.1:5701,172.18.1.2:5701,172.18.1.3:5701 \
|
||||
-e HAZELCAST_GROUP_NAME=bitbucket -e HAZELCAST_GROUP_PASSWORD=mysecretpassword \
|
||||
-v /data/bitbucket-shared:/var/atlassian/application-data/bitbucket/shared --name="bitbucket" -d -p 7990:7990 -p 7999:7999 atlassian/bitbucket-server
|
||||
|
||||
## JMX Monitoring (Bitbucket Server 5.0 + only)
|
||||
|
||||
Bitbucket Server supports detailed JMX monitoring. To enable and configure JMX, use the environment variables below. For further information on JMX configuration, see [Enabling JMX counters for performance monitoring](https://confluence.atlassian.com/bitbucketserver/enabling-jmx-counters-for-performance-monitoring-776640189.html)
|
||||
|
||||
* `JMX_ENABLED` (default: false)
|
||||
|
||||
Enable Bitbucket to publish JMX data
|
||||
|
||||
* `JMX_REMOTE_AUTH` (default: NONE)
|
||||
|
||||
Set the authentication to use for remote JMX access. This value is required: anything other than "password" or "ssl" will cause remote JMX access to be disabled
|
||||
|
||||
* `JMX_REMOTE_PORT` (default: 3333)
|
||||
|
||||
The port used to negotiate a JMX connection. Note: this port is only used during the initial authorization, after which a different RMI port used for data transfer
|
||||
|
||||
* `JMX_REMOTE_RMI_PORT` (default: <random>)
|
||||
|
||||
The port used for all subsequent JMX-RMI data transfer. If desired, the RMI data port can be set to the same value as `JMX_REMOTE_PORT` to allow a single port to be used for both JMX authorization and data transfer
|
||||
|
||||
* `RMI_SERVER_HOSTNAME` (default: NONE)
|
||||
|
||||
The hostname or IP address that clients will use to connect to the application for JMX monitoring. This must be resolvable by both clients and from the JVM host machine.
|
||||
|
||||
* `JMX_PASSWORD_FILE` (default: NONE)
|
||||
|
||||
The full path to the JMX username/password file used to authenticate remote JMX clients. This is required when `JMX_REMOTE_AUTH` is set to "password"
|
||||
|
||||
$> docker run -e JMX_ENABLED=true -e JMX_REMOTE_AUTH=password -e JMX_REMOTE_RMI_PORT=3333 -e RMI_SERVER_HOSTNAME=bitbucket \
|
||||
-e JMX_PASSWORD_FILE=/data/bitbucket:/var/atlassian/application-data/bitbucket/jmx.access \
|
||||
-v /data/bitbucket:/var/atlassian/application-data/bitbucket --name="bitbucket" -d -p 7990:7990 -p 7999:7999 -p 3333:3333 atlassian/bitbucket-server
|
||||
|
||||
# Upgrade
|
||||
|
||||
To upgrade to a more recent version of Bitbucket Server you can simply stop the `bitbucket`
|
||||
container and start a new one based on a more recent image:
|
||||
|
||||
$> docker stop bitbucket
|
||||
$> docker rm bitbucket
|
||||
$> docker pull atlassian/bitbucket-server:<desired_version>
|
||||
$> docker run ... (See above)
|
||||
|
||||
As your data is stored in the data volume directory on the host it will still
|
||||
be available after the upgrade.
|
||||
|
||||
_Note: Please make sure that you **don't** accidentally remove the `bitbucket`
|
||||
container and its volumes using the `-v` option._
|
||||
|
||||
# Backup
|
||||
|
||||
For evaluations you can use the built-in database that will store its files in the Bitbucket Server home directory. In that case it is sufficient to create a backup archive of the directory on the host that is used as a volume (`/data/bitbucket` in the example above).
|
||||
|
||||
The [Bitbucket Server Backup Client](https://confluence.atlassian.com/display/BitbucketServer/Data+recovery+and+backups) is currently not supported in the Docker setup. You can however use the [Bitbucket Server DIY Backup](https://confluence.atlassian.com/display/BitbucketServer/Using+Bitbucket+Server+DIY+Backup) approach in case you decided to use an external database.
|
||||
|
||||
Read more about data recovery and backups: [https://confluence.atlassian.com/display/BitbucketServer/Data+recovery+and+backups](https://confluence.atlassian.com/display/BitbucketServer/Data+recovery+and+backups)
|
||||
|
||||
# Versioning
|
||||
|
||||
The `latest` tag matches the most recent version of this repository. Thus using `atlassian/bitbucket:latest` or `atlassian/bitbucket` will ensure you are running the most up to date version of this image.
|
||||
|
||||
However, we ** strongly recommend ** that for non-eval workloads you select a specific version in order to prevent breaking changes from impacting your setup.
|
||||
You can use a specific minor version of Bitbucket Server by using a version number
|
||||
tag: `atlassian/bitbucket-server:4.14`. This will install the latest `4.14.x` version that
|
||||
is available.
|
||||
|
||||
|
||||
# Issue tracker
|
||||
|
||||
Please raise an [issue](https://bitbucket.org/atlassian/docker-atlassian-bitbucket-server/issues) if you encounter any problems with this Dockerfile.
|
||||
|
||||
# Support
|
||||
|
||||
For product support, go to [support.atlassian.com](https://support.atlassian.com/)
|
||||
Octotree is enabled on this page. Click this button or press cmd shift s (or ctrl shift s) to show it.
|
||||
Support us • Feedback?
|
@ -0,0 +1,16 @@
|
||||
#version: '3'
|
||||
services:
|
||||
app:
|
||||
image: "epicmorg/bitbucket:8.19.6"
|
||||
build:
|
||||
context: .
|
||||
app-jdk11:
|
||||
image: "epicmorg/bitbucket:8.19.6-jdk11"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: ./Dockerfile.jdk11
|
||||
app-jdk17:
|
||||
image: "epicmorg/bitbucket:8.19.6-jdk17"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: ./Dockerfile.jdk17
|
57
linux/ecosystem/atlassian/bitbucket/8/8.19.6/entrypoint.sh
Executable file
57
linux/ecosystem/atlassian/bitbucket/8/8.19.6/entrypoint.sh
Executable file
@ -0,0 +1,57 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
# Set recommended umask of "u=,g=w,o=rwx" (0027)
|
||||
umask 0027
|
||||
|
||||
export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
|
||||
export JRE_HOME="$JAVA_HOME/jre"
|
||||
export JAVA_BINARY="$JRE_HOME/bin/java"
|
||||
export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}')
|
||||
|
||||
#export PATH=$JAVA_HOME/bin:$PATH
|
||||
|
||||
|
||||
# Setup Catalina Opts
|
||||
: ${CATALINA_CONNECTOR_PROXYNAME:=}
|
||||
: ${CATALINA_CONNECTOR_PROXYPORT:=}
|
||||
: ${CATALINA_CONNECTOR_SCHEME:=http}
|
||||
: ${CATALINA_CONNECTOR_SECURE:=false}
|
||||
|
||||
: ${CATALINA_OPTS:=}
|
||||
|
||||
: ${JAVA_OPTS:=}
|
||||
|
||||
: ${ELASTICSEARCH_ENABLED:=true}
|
||||
: ${APPLICATION_MODE:=}
|
||||
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}"
|
||||
|
||||
JAVA_OPTS="${JAVA_OPTS} ${CATALINA_OPTS}"
|
||||
|
||||
ARGS="$@"
|
||||
|
||||
# Start Bitbucket without Elasticsearch
|
||||
if [ "${ELASTICSEARCH_ENABLED}" == "false" ] || [ "${APPLICATION_MODE}" == "mirror" ]; then
|
||||
ARGS="--no-search ${ARGS}"
|
||||
fi
|
||||
|
||||
# Start Bitbucket as the correct user.
|
||||
if [ "${UID}" -eq 0 ]; then
|
||||
echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}"
|
||||
PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${BITBUCKET_HOME}")
|
||||
EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700
|
||||
if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then
|
||||
echo "Updating permissions for BITBUCKET_HOME"
|
||||
mkdir -p "${BITBUCKET_HOME}/lib" &&
|
||||
chmod -R 700 "${BITBUCKET_HOME}" &&
|
||||
chown -R "${RUN_USER}:${RUN_GROUP}" "${BITBUCKET_HOME}"
|
||||
fi
|
||||
# Now drop privileges
|
||||
exec su -s /bin/bash "${RUN_USER}" -c "${BITBUCKET_INSTALL_DIR}/bin/start-bitbucket.sh ${ARGS}"
|
||||
else
|
||||
exec "${BITBUCKET_INSTALL_DIR}/bin/start-bitbucket.sh" ${ARGS}
|
||||
fi
|
196
linux/ecosystem/atlassian/bitbucket/8/8.19.6/kaniko-build.py
Normal file
196
linux/ecosystem/atlassian/bitbucket/8/8.19.6/kaniko-build.py
Normal file
@ -0,0 +1,196 @@
|
||||
import os
|
||||
import shutil
|
||||
import argparse
|
||||
import yaml
|
||||
import subprocess
|
||||
from collections import defaultdict
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
from dotenv import load_dotenv
|
||||
import logging
|
||||
import sys
|
||||
|
||||
# Script version
|
||||
SCRIPT_VERSION = "1.0.1.0"
|
||||
|
||||
# ASCII art for EpicMorg
|
||||
ASCII_ART = r"""
|
||||
+=================================================+
|
||||
| ____| _) \ | |
|
||||
| __| __ \ | __| |\/ | _ \ __| _` | |
|
||||
| | | | | ( | | ( | | ( | |
|
||||
|_____| .__/ _| \___| _| _| \___/ _| \__, | |
|
||||
| | / _| _) | |___/ |
|
||||
| ' / _` | __ \ | | / _ \ |
|
||||
| . \ ( | | | | < ( | |
|
||||
|_|\_\ \__,_| _| _| _| _|\_\ \___/ |
|
||||
|\ \ / |
|
||||
| \ \ \ / __| _` | __ \ __ \ _ \ __||
|
||||
| \ \ \ / | ( | | | | | __/ | |
|
||||
| \_/\_/ _| \__,_| .__/ .__/ \___| _| |
|
||||
| _| _| |
|
||||
+=================================================+
|
||||
"""
|
||||
|
||||
# Load environment variables from .env file
|
||||
load_dotenv()
|
||||
|
||||
def setup_logging():
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
|
||||
def parse_args():
|
||||
parser = argparse.ArgumentParser(description="EpicMorg: Kaniko-Compose Wrapper", add_help=False)
|
||||
parser.add_argument('--compose-file', default=os.getenv('COMPOSE_FILE', 'docker-compose.yml'), help='Path to docker-compose.yml file')
|
||||
parser.add_argument('--kaniko-image', default=os.getenv('KANIKO_IMAGE', 'gcr.io/kaniko-project/executor:latest'), help='Kaniko executor image')
|
||||
parser.add_argument('--push', '--deploy', '-d', '-p', action='store_true', help='Deploy the built images to the registry')
|
||||
parser.add_argument('--dry-run', '--dry', action='store_true', help='Dry run: build images without pushing and with cleanup')
|
||||
parser.add_argument('--version', '-v', action='store_true', help='Show script version')
|
||||
parser.add_argument('--help', '-h', action='store_true', help='Show this help message and exit')
|
||||
return parser.parse_args()
|
||||
|
||||
def load_compose_file(file_path):
|
||||
with open(file_path, 'r') as file:
|
||||
return yaml.safe_load(file)
|
||||
|
||||
def build_with_kaniko(service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry):
|
||||
kaniko_command = [
|
||||
'docker', 'run',
|
||||
'--rm',
|
||||
'-t',
|
||||
'-v', f'{os.path.abspath(build_context)}:/workspace',
|
||||
]
|
||||
|
||||
# Add Docker config mounts for both read-only access
|
||||
kaniko_command.extend([
|
||||
'-v', '/var/run/docker.sock:/var/run/docker.sock:ro', # Access to Docker daemon
|
||||
'-v', f'{os.path.expanduser("~")}/.docker:/kaniko/.docker:ro', # Use existing Docker credentials in read-only mode
|
||||
])
|
||||
|
||||
kaniko_command.extend([
|
||||
kaniko_image,
|
||||
'--context', '/workspace',
|
||||
'--dockerfile', f'/workspace/{dockerfile}',
|
||||
'--compressed-caching',
|
||||
'--single-snapshot',
|
||||
'--cleanup'
|
||||
])
|
||||
|
||||
if deploy:
|
||||
kaniko_command.extend([
|
||||
'--destination', image_name
|
||||
])
|
||||
elif dry:
|
||||
kaniko_command.extend([
|
||||
'--no-push'
|
||||
])
|
||||
else:
|
||||
kaniko_command.extend([
|
||||
'--no-push'
|
||||
])
|
||||
|
||||
# Add build arguments if they exist
|
||||
for arg_name, arg_value in build_args.items():
|
||||
kaniko_command.extend(['--build-arg', f'{arg_name}={arg_value}'])
|
||||
|
||||
logging.info(f"Building {service_name} with Kaniko: {' '.join(kaniko_command)}")
|
||||
|
||||
process = subprocess.Popen(kaniko_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
||||
|
||||
# Stream output in real-time
|
||||
for line in process.stdout:
|
||||
logging.info(line.strip())
|
||||
|
||||
process.wait()
|
||||
|
||||
if process.returncode == 0:
|
||||
logging.info(f"Successfully built {service_name}")
|
||||
else:
|
||||
for line in process.stderr:
|
||||
logging.error(line.strip())
|
||||
logging.error(f"Error building {service_name}")
|
||||
raise Exception(f"Failed to build {service_name}")
|
||||
|
||||
def show_help():
|
||||
print(ASCII_ART)
|
||||
print("EpicMorg: Kaniko-Compose Wrapper\n")
|
||||
print("Arguments:")
|
||||
print("--compose-file Path to docker-compose.yml file")
|
||||
print("--kaniko-image Kaniko executor image")
|
||||
print("--push, --deploy, -d, -p Deploy the built images to the registry")
|
||||
print("--dry-run, --dry Dry run: build images without pushing and with cleanup")
|
||||
print("--version, -v Show script version")
|
||||
print("--help, -h Show this help message and exit")
|
||||
|
||||
def show_version():
|
||||
print(ASCII_ART)
|
||||
print(f"EpicMorg: Kaniko-Compose Wrapper {SCRIPT_VERSION}, Python: {sys.version}")
|
||||
|
||||
def main():
|
||||
setup_logging()
|
||||
|
||||
args = parse_args()
|
||||
|
||||
# Show help and exit if --help is provided
|
||||
if args.help:
|
||||
show_help()
|
||||
return
|
||||
|
||||
# Show version and exit if --version or no relevant arguments are provided
|
||||
if args.version or not (args.push or args.dry_run or args.compose_file != 'docker-compose.yml' or args.kaniko_image != 'gcr.io/kaniko-project/executor:latest'):
|
||||
show_version()
|
||||
return
|
||||
|
||||
compose_file = args.compose_file
|
||||
kaniko_image = args.kaniko_image
|
||||
deploy = args.push
|
||||
dry = args.dry_run
|
||||
|
||||
if not os.path.exists(compose_file):
|
||||
logging.error(f"{compose_file} not found")
|
||||
return
|
||||
|
||||
compose_data = load_compose_file(compose_file)
|
||||
|
||||
services = compose_data.get('services', {})
|
||||
image_names = defaultdict(int)
|
||||
|
||||
for service_name, service_data in services.items():
|
||||
image_name = service_data.get('image')
|
||||
|
||||
if not image_name:
|
||||
logging.warning(f"No image specified for service {service_name}")
|
||||
continue
|
||||
|
||||
image_names[image_name] += 1
|
||||
|
||||
for image_name, count in image_names.items():
|
||||
if count > 1:
|
||||
logging.error(f"Error: Image name {image_name} is used {count} times.")
|
||||
return
|
||||
|
||||
try:
|
||||
with ThreadPoolExecutor() as executor:
|
||||
futures = []
|
||||
for service_name, service_data in services.items():
|
||||
build_data = service_data.get('build', {})
|
||||
build_context = build_data.get('context', '.')
|
||||
dockerfile = build_data.get('dockerfile', 'Dockerfile')
|
||||
image_name = service_data.get('image')
|
||||
build_args = build_data.get('args', {})
|
||||
|
||||
# Substitute environment variables with their values if they exist
|
||||
build_args = {key: os.getenv(key, value) for key, value in build_args.items()}
|
||||
|
||||
if not image_name:
|
||||
logging.warning(f"No image specified for service {service_name}")
|
||||
continue
|
||||
|
||||
futures.append(executor.submit(build_with_kaniko, service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry))
|
||||
|
||||
for future in as_completed(futures):
|
||||
future.result()
|
||||
except Exception as exc:
|
||||
logging.error(f"Build failed: {exc}")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -0,0 +1,2 @@
|
||||
PyYAML
|
||||
python-dotenv
|
46
linux/ecosystem/atlassian/bitbucket/9/9.0.0/Dockerfile
Normal file
46
linux/ecosystem/atlassian/bitbucket/9/9.0.0/Dockerfile
Normal file
@ -0,0 +1,46 @@
|
||||
FROM epicmorg/debian:bookworm-jdk11
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
ARG BITBUCKET_VERSION=9.0.0
|
||||
ARG DOWNLOAD_URL=https://product-downloads.atlassian.com/software/stash/downloads/atlassian-bitbucket-${BITBUCKET_VERSION}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/display/BitbucketServer/Bitbucket+Server+home+directory
|
||||
ENV BITBUCKET_HOME /var/atlassian/application-data/bitbucket
|
||||
ENV BITBUCKET_INSTALL_DIR /opt/atlassian/bitbucket
|
||||
|
||||
VOLUME ["${BITBUCKET_HOME}"]
|
||||
WORKDIR $BITBUCKET_HOME
|
||||
|
||||
# Expose HTTP and SSH ports
|
||||
EXPOSE 7990
|
||||
EXPOSE 7999
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --allow-downgrades git/bookworm
|
||||
|
||||
RUN mkdir -p ${BITBUCKET_INSTALL_DIR} \
|
||||
&& curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "${BITBUCKET_INSTALL_DIR}" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${BITBUCKET_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^# umask/umask/' ${BITBUCKET_INSTALL_DIR}/bin/_start-webapp.sh && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
||||
COPY entrypoint.sh /entrypoint.sh
|
46
linux/ecosystem/atlassian/bitbucket/9/9.0.0/Dockerfile.jdk11
Normal file
46
linux/ecosystem/atlassian/bitbucket/9/9.0.0/Dockerfile.jdk11
Normal file
@ -0,0 +1,46 @@
|
||||
FROM epicmorg/debian:bookworm-jdk11
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
ARG BITBUCKET_VERSION=9.0.0
|
||||
ARG DOWNLOAD_URL=https://product-downloads.atlassian.com/software/stash/downloads/atlassian-bitbucket-${BITBUCKET_VERSION}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/display/BitbucketServer/Bitbucket+Server+home+directory
|
||||
ENV BITBUCKET_HOME /var/atlassian/application-data/bitbucket
|
||||
ENV BITBUCKET_INSTALL_DIR /opt/atlassian/bitbucket
|
||||
|
||||
VOLUME ["${BITBUCKET_HOME}"]
|
||||
WORKDIR $BITBUCKET_HOME
|
||||
|
||||
# Expose HTTP and SSH ports
|
||||
EXPOSE 7990
|
||||
EXPOSE 7999
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --allow-downgrades git/bookworm
|
||||
|
||||
RUN mkdir -p ${BITBUCKET_INSTALL_DIR} \
|
||||
&& curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "${BITBUCKET_INSTALL_DIR}" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${BITBUCKET_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^# umask/umask/' ${BITBUCKET_INSTALL_DIR}/bin/_start-webapp.sh && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
||||
COPY entrypoint.sh /entrypoint.sh
|
46
linux/ecosystem/atlassian/bitbucket/9/9.0.0/Dockerfile.jdk17
Normal file
46
linux/ecosystem/atlassian/bitbucket/9/9.0.0/Dockerfile.jdk17
Normal file
@ -0,0 +1,46 @@
|
||||
FROM epicmorg/debian:bookworm-jdk17
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
ARG BITBUCKET_VERSION=9.0.0
|
||||
ARG DOWNLOAD_URL=https://product-downloads.atlassian.com/software/stash/downloads/atlassian-bitbucket-${BITBUCKET_VERSION}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/display/BitbucketServer/Bitbucket+Server+home+directory
|
||||
ENV BITBUCKET_HOME /var/atlassian/application-data/bitbucket
|
||||
ENV BITBUCKET_INSTALL_DIR /opt/atlassian/bitbucket
|
||||
|
||||
VOLUME ["${BITBUCKET_HOME}"]
|
||||
WORKDIR $BITBUCKET_HOME
|
||||
|
||||
# Expose HTTP and SSH ports
|
||||
EXPOSE 7990
|
||||
EXPOSE 7999
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --allow-downgrades git/bookworm
|
||||
|
||||
RUN mkdir -p ${BITBUCKET_INSTALL_DIR} \
|
||||
&& curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "${BITBUCKET_INSTALL_DIR}" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${BITBUCKET_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^# umask/umask/' ${BITBUCKET_INSTALL_DIR}/bin/_start-webapp.sh && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
||||
COPY entrypoint.sh /entrypoint.sh
|
50
linux/ecosystem/atlassian/bitbucket/9/9.0.0/Makefile
Normal file
50
linux/ecosystem/atlassian/bitbucket/9/9.0.0/Makefile
Normal file
@ -0,0 +1,50 @@
|
||||
PIP_BREAK_SYSTEM_PACKAGES=1
|
||||
|
||||
all: app
|
||||
|
||||
app:
|
||||
make build
|
||||
make deploy
|
||||
make clean
|
||||
|
||||
build:
|
||||
make pip
|
||||
python3 kaniko-build.py --version
|
||||
|
||||
dry:
|
||||
make dry-run
|
||||
|
||||
test:
|
||||
make dry-run
|
||||
|
||||
dry-run:
|
||||
python3 kaniko-build.py --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug --dry-run
|
||||
|
||||
pip:
|
||||
rm -rf /usr/lib/python3.6/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.7/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.8/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.13/EXTERNALLY-MANAGED
|
||||
pip3 install -r requirements.txt
|
||||
pip install -r requirements.txt
|
||||
|
||||
build-compose:
|
||||
docker-compose build --compress --parallel --progress plain
|
||||
|
||||
deploy:
|
||||
make pip
|
||||
python3 kaniko-build.py --deploy --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug
|
||||
|
||||
deploy-compose:
|
||||
docker-compose push
|
||||
|
||||
clean:
|
||||
docker container prune -f
|
||||
docker image prune -f
|
||||
docker network prune -f
|
||||
docker volume prune -f
|
||||
docker system prune -af
|
216
linux/ecosystem/atlassian/bitbucket/9/9.0.0/README.md
Normal file
216
linux/ecosystem/atlassian/bitbucket/9/9.0.0/README.md
Normal file
@ -0,0 +1,216 @@
|
||||
![Atlassian Bitbucket Server](https://www.atlassian.com/dam/wac/legacy/bitbucket_logo_landing.png)
|
||||
|
||||
Bitbucket Server is an on-premises source code management solution for Git that's secure, fast, and enterprise grade. Create and manage repositories, set up fine-grained permissions, and collaborate on code - all with the flexibility of your servers.
|
||||
|
||||
Learn more about Bitbucket Server: <https://www.atlassian.com/software/bitbucket/server>
|
||||
|
||||
# Overview
|
||||
|
||||
This Docker container makes it easy to get an instance of Bitbucket up and running.
|
||||
|
||||
** We strongly recommend you run this image using a specific version tag instead of latest. This is because the image referenced by the latest tag changes often and we cannot guarantee that it will be backwards compatible. **
|
||||
|
||||
# Quick Start
|
||||
|
||||
For the `BITBUCKET_HOME` directory that is used to store the repository data
|
||||
(amongst other things) we recommend mounting a host directory as a [data volume](https://docs.docker.com/engine/tutorials/dockervolumes/#/data-volumes), or via a named volume if using a docker version >= 1.9.
|
||||
|
||||
Volume permission is managed by entry scripts. To get started you can use a data volume, or named volumes. In this example we'll use named volumes.
|
||||
|
||||
$> docker volume create --name bitbucketVolume
|
||||
$> docker run -v bitbucketVolume:/var/atlassian/application-data/bitbucket --name="bitbucket" -d -p 7990:7990 -p 7999:7999 atlassian/bitbucket-server
|
||||
|
||||
Note that this command can substitute folder paths with named volumes.
|
||||
|
||||
Start Atlassian Bitbucket Server:
|
||||
|
||||
$> docker run -v /data/bitbucket:/var/atlassian/application-data/bitbucket --name="bitbucket" -d -p 7990:7990 -p 7999:7999 atlassian/bitbucket-server
|
||||
|
||||
**Success**. Bitbucket is now available on [http://localhost:7990](http://localhost:7990)*
|
||||
|
||||
Please ensure your container has the necessary resources allocated to it.
|
||||
We recommend 2GiB of memory allocated to accommodate both the application server
|
||||
and the git processes.
|
||||
See [Supported Platforms](https://confluence.atlassian.com/display/BitbucketServer/Supported+platforms) for further information.
|
||||
|
||||
|
||||
_* Note: If you are using `docker-machine` on Mac OS X, please use `open http://$(docker-machine ip default):7990` instead._
|
||||
|
||||
## Reverse Proxy Settings
|
||||
|
||||
If Bitbucket is run behind a reverse proxy server as [described here](https://confluence.atlassian.com/bitbucketserver/proxying-and-securing-bitbucket-server-776640099.html),
|
||||
then you need to specify extra options to make bitbucket aware of the setup. They can be controlled via the below
|
||||
environment variables.
|
||||
|
||||
### Bitbucket Server 5.0 +
|
||||
|
||||
Due to the migration to Spring Boot in 5.0, there are changes to how you set up Bitbucket to run behind a reverse proxy.
|
||||
|
||||
In this example, we'll use an environment file. You can also do this via [specifying each environment variable](https://docs.docker.com/engine/reference/run/#env-environment-variables) via the `-e` argument in `docker run`.
|
||||
|
||||
#### secure-bitbucket.env
|
||||
```
|
||||
SERVER_SECURE=true
|
||||
SERVER_SCHEME=https
|
||||
SERVER_PROXY_PORT=443
|
||||
SERVER_PROXY_NAME=<Your url here>
|
||||
```
|
||||
|
||||
Then you run Bitbucket as usual
|
||||
|
||||
`docker run -v bitbucketVolume:/var/atlassian/application-data/bitbucket --name="bitbucket" -d -p 7990:7990 -p 7999:7999 --env-file=/path/to/env/file/secure-bitbucket.env atlassian/bitbucket-server:5.0`
|
||||
|
||||
### Bitbucket Server < 5.0
|
||||
|
||||
To set the reverse proxy arguments, you specify the following as environment variables in the `docker run` command
|
||||
|
||||
* `CATALINA_CONNECTOR_PROXYNAME` (default: NONE)
|
||||
|
||||
The reverse proxy's fully qualified hostname.
|
||||
|
||||
* `CATALINA_CONNECTOR_PROXYPORT` (default: NONE)
|
||||
|
||||
The reverse proxy's port number via which bitbucket is accessed.
|
||||
|
||||
* `CATALINA_CONNECTOR_SCHEME` (default: http)
|
||||
|
||||
The protocol via which bitbucket is accessed.
|
||||
|
||||
* `CATALINA_CONNECTOR_SECURE` (default: false)
|
||||
|
||||
Set 'true' if CATALINA\_CONNECTOR\_SCHEME is 'https'.
|
||||
|
||||
## JVM Configuration (Bitbucket Server 5.0 + only)
|
||||
|
||||
If you need to override Bitbucket Server's default memory configuration or pass additional JVM arguments, use the environment variables below
|
||||
|
||||
* `JVM_MINIMUM_MEMORY` (default: 512m)
|
||||
|
||||
The minimum heap size of the JVM
|
||||
|
||||
* `JVM_MAXIMUM_MEMORY` (default: 1024m)
|
||||
|
||||
The maximum heap size of the JVM
|
||||
|
||||
* `JVM_SUPPORT_RECOMMENDED_ARGS` (default: NONE)
|
||||
|
||||
Additional JVM arguments for Bitbucket Server, such as a custom Java Trust Store
|
||||
|
||||
## Application Mode Settings (Bitbucket Server 5.0 + only)
|
||||
|
||||
This docker image can be run as a [Smart Mirror](https://confluence.atlassian.com/bitbucketserver/smart-mirroring-776640046.html) or as part of a [Data Center](https://confluence.atlassian.com/enterprise/bitbucket-data-center-668468332.html) cluster.
|
||||
You can specify the following properties to start Bitbucket as a mirror or as a Data Center node:
|
||||
|
||||
* `ELASTICSEARCH_ENABLED` (default: true)
|
||||
|
||||
Set 'false' to prevent Elasticsearch from starting in the container. This should be used if Elasticsearch is running remotely, e.g. for if Bitbucket is running in a Data Center cluster
|
||||
|
||||
* `APPLICATION_MODE` (default: default)
|
||||
|
||||
The mode Bitbucket will run in. This can be set to 'mirror' to start Bitbucket as a Smart Mirror. This will also disable Elasticsearch even if `ELASTICSEARCH_ENABLED` has not been set to 'false'.
|
||||
|
||||
* `HAZELCAST_NETWORK_MULTICAST` (default: false)
|
||||
|
||||
Data Center: Set 'true' to enable Bitbucket to find new Data Center cluster members via multicast. `HAZELCAST_NETWORK_TCPIP` should not be specified when using this setting.
|
||||
|
||||
* `HAZELCAST_NETWORK_TCPIP` (default: false)
|
||||
|
||||
Data Center: Set 'true' to enable Bitbucket to find new Data Center cluster members via TCPIP. This setting requires `HAZELCAST_NETWORK_TCPIP_MEMBERS` to be specified. `HAZELCAST_NETWORK_MULTICAST` should not be specified when using this setting.
|
||||
|
||||
* `HAZELCAST_NETWORK_TCPIP_MEMBERS`
|
||||
|
||||
Data Center: List of members that Hazelcast nodes should connect to when HAZELCAST_NETWORK_TCPIP is 'true'
|
||||
|
||||
* `HAZELCAST_GROUP_NAME`
|
||||
|
||||
Data Center: Specifies the cluster group the instance should join.
|
||||
|
||||
* `HAZELCAST_GROUP_PASSWORD`
|
||||
|
||||
Data Center: The password required to join the specified cluster group.
|
||||
|
||||
To run Bitbucket as part of a Data Center cluster, create a Docker network and assign the Bitbucket container a static IP.
|
||||
|
||||
Note: Docker networks may support multicast, however the below example shows configuration using TCPIP.
|
||||
|
||||
$> docker network create --driver bridge --subnet=172.18.0.0/16 myBitbucketNetwork
|
||||
$> docker run --network=myBitbucketNetwork --ip=172.18.1.1 -e ELASTICSEARCH_ENABLED=false \
|
||||
-e HAZELCAST_NETWORK_TCPIP=true -e HAZELCAST_NETWORK_TCPIP_MEMBERS=172.18.1.1:5701,172.18.1.2:5701,172.18.1.3:5701 \
|
||||
-e HAZELCAST_GROUP_NAME=bitbucket -e HAZELCAST_GROUP_PASSWORD=mysecretpassword \
|
||||
-v /data/bitbucket-shared:/var/atlassian/application-data/bitbucket/shared --name="bitbucket" -d -p 7990:7990 -p 7999:7999 atlassian/bitbucket-server
|
||||
|
||||
## JMX Monitoring (Bitbucket Server 5.0 + only)
|
||||
|
||||
Bitbucket Server supports detailed JMX monitoring. To enable and configure JMX, use the environment variables below. For further information on JMX configuration, see [Enabling JMX counters for performance monitoring](https://confluence.atlassian.com/bitbucketserver/enabling-jmx-counters-for-performance-monitoring-776640189.html)
|
||||
|
||||
* `JMX_ENABLED` (default: false)
|
||||
|
||||
Enable Bitbucket to publish JMX data
|
||||
|
||||
* `JMX_REMOTE_AUTH` (default: NONE)
|
||||
|
||||
Set the authentication to use for remote JMX access. This value is required: anything other than "password" or "ssl" will cause remote JMX access to be disabled
|
||||
|
||||
* `JMX_REMOTE_PORT` (default: 3333)
|
||||
|
||||
The port used to negotiate a JMX connection. Note: this port is only used during the initial authorization, after which a different RMI port used for data transfer
|
||||
|
||||
* `JMX_REMOTE_RMI_PORT` (default: <random>)
|
||||
|
||||
The port used for all subsequent JMX-RMI data transfer. If desired, the RMI data port can be set to the same value as `JMX_REMOTE_PORT` to allow a single port to be used for both JMX authorization and data transfer
|
||||
|
||||
* `RMI_SERVER_HOSTNAME` (default: NONE)
|
||||
|
||||
The hostname or IP address that clients will use to connect to the application for JMX monitoring. This must be resolvable by both clients and from the JVM host machine.
|
||||
|
||||
* `JMX_PASSWORD_FILE` (default: NONE)
|
||||
|
||||
The full path to the JMX username/password file used to authenticate remote JMX clients. This is required when `JMX_REMOTE_AUTH` is set to "password"
|
||||
|
||||
$> docker run -e JMX_ENABLED=true -e JMX_REMOTE_AUTH=password -e JMX_REMOTE_RMI_PORT=3333 -e RMI_SERVER_HOSTNAME=bitbucket \
|
||||
-e JMX_PASSWORD_FILE=/data/bitbucket:/var/atlassian/application-data/bitbucket/jmx.access \
|
||||
-v /data/bitbucket:/var/atlassian/application-data/bitbucket --name="bitbucket" -d -p 7990:7990 -p 7999:7999 -p 3333:3333 atlassian/bitbucket-server
|
||||
|
||||
# Upgrade
|
||||
|
||||
To upgrade to a more recent version of Bitbucket Server you can simply stop the `bitbucket`
|
||||
container and start a new one based on a more recent image:
|
||||
|
||||
$> docker stop bitbucket
|
||||
$> docker rm bitbucket
|
||||
$> docker pull atlassian/bitbucket-server:<desired_version>
|
||||
$> docker run ... (See above)
|
||||
|
||||
As your data is stored in the data volume directory on the host it will still
|
||||
be available after the upgrade.
|
||||
|
||||
_Note: Please make sure that you **don't** accidentally remove the `bitbucket`
|
||||
container and its volumes using the `-v` option._
|
||||
|
||||
# Backup
|
||||
|
||||
For evaluations you can use the built-in database that will store its files in the Bitbucket Server home directory. In that case it is sufficient to create a backup archive of the directory on the host that is used as a volume (`/data/bitbucket` in the example above).
|
||||
|
||||
The [Bitbucket Server Backup Client](https://confluence.atlassian.com/display/BitbucketServer/Data+recovery+and+backups) is currently not supported in the Docker setup. You can however use the [Bitbucket Server DIY Backup](https://confluence.atlassian.com/display/BitbucketServer/Using+Bitbucket+Server+DIY+Backup) approach in case you decided to use an external database.
|
||||
|
||||
Read more about data recovery and backups: [https://confluence.atlassian.com/display/BitbucketServer/Data+recovery+and+backups](https://confluence.atlassian.com/display/BitbucketServer/Data+recovery+and+backups)
|
||||
|
||||
# Versioning
|
||||
|
||||
The `latest` tag matches the most recent version of this repository. Thus using `atlassian/bitbucket:latest` or `atlassian/bitbucket` will ensure you are running the most up to date version of this image.
|
||||
|
||||
However, we ** strongly recommend ** that for non-eval workloads you select a specific version in order to prevent breaking changes from impacting your setup.
|
||||
You can use a specific minor version of Bitbucket Server by using a version number
|
||||
tag: `atlassian/bitbucket-server:4.14`. This will install the latest `4.14.x` version that
|
||||
is available.
|
||||
|
||||
|
||||
# Issue tracker
|
||||
|
||||
Please raise an [issue](https://bitbucket.org/atlassian/docker-atlassian-bitbucket-server/issues) if you encounter any problems with this Dockerfile.
|
||||
|
||||
# Support
|
||||
|
||||
For product support, go to [support.atlassian.com](https://support.atlassian.com/)
|
||||
Octotree is enabled on this page. Click this button or press cmd shift s (or ctrl shift s) to show it.
|
||||
Support us • Feedback?
|
@ -0,0 +1,16 @@
|
||||
#version: '3'
|
||||
services:
|
||||
app:
|
||||
image: "epicmorg/bitbucket:9.0.0"
|
||||
build:
|
||||
context: .
|
||||
app-jdk11:
|
||||
image: "epicmorg/bitbucket:9.0.0-jdk11"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: ./Dockerfile.jdk11
|
||||
app-jdk17:
|
||||
image: "epicmorg/bitbucket:9.0.0-jdk17"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: ./Dockerfile.jdk17
|
57
linux/ecosystem/atlassian/bitbucket/9/9.0.0/entrypoint.sh
Executable file
57
linux/ecosystem/atlassian/bitbucket/9/9.0.0/entrypoint.sh
Executable file
@ -0,0 +1,57 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
# Set recommended umask of "u=,g=w,o=rwx" (0027)
|
||||
umask 0027
|
||||
|
||||
export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
|
||||
export JRE_HOME="$JAVA_HOME/jre"
|
||||
export JAVA_BINARY="$JRE_HOME/bin/java"
|
||||
export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}')
|
||||
|
||||
#export PATH=$JAVA_HOME/bin:$PATH
|
||||
|
||||
|
||||
# Setup Catalina Opts
|
||||
: ${CATALINA_CONNECTOR_PROXYNAME:=}
|
||||
: ${CATALINA_CONNECTOR_PROXYPORT:=}
|
||||
: ${CATALINA_CONNECTOR_SCHEME:=http}
|
||||
: ${CATALINA_CONNECTOR_SECURE:=false}
|
||||
|
||||
: ${CATALINA_OPTS:=}
|
||||
|
||||
: ${JAVA_OPTS:=}
|
||||
|
||||
: ${ELASTICSEARCH_ENABLED:=true}
|
||||
: ${APPLICATION_MODE:=}
|
||||
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}"
|
||||
|
||||
JAVA_OPTS="${JAVA_OPTS} ${CATALINA_OPTS}"
|
||||
|
||||
ARGS="$@"
|
||||
|
||||
# Start Bitbucket without Elasticsearch
|
||||
if [ "${ELASTICSEARCH_ENABLED}" == "false" ] || [ "${APPLICATION_MODE}" == "mirror" ]; then
|
||||
ARGS="--no-search ${ARGS}"
|
||||
fi
|
||||
|
||||
# Start Bitbucket as the correct user.
|
||||
if [ "${UID}" -eq 0 ]; then
|
||||
echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}"
|
||||
PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${BITBUCKET_HOME}")
|
||||
EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700
|
||||
if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then
|
||||
echo "Updating permissions for BITBUCKET_HOME"
|
||||
mkdir -p "${BITBUCKET_HOME}/lib" &&
|
||||
chmod -R 700 "${BITBUCKET_HOME}" &&
|
||||
chown -R "${RUN_USER}:${RUN_GROUP}" "${BITBUCKET_HOME}"
|
||||
fi
|
||||
# Now drop privileges
|
||||
exec su -s /bin/bash "${RUN_USER}" -c "${BITBUCKET_INSTALL_DIR}/bin/start-bitbucket.sh ${ARGS}"
|
||||
else
|
||||
exec "${BITBUCKET_INSTALL_DIR}/bin/start-bitbucket.sh" ${ARGS}
|
||||
fi
|
196
linux/ecosystem/atlassian/bitbucket/9/9.0.0/kaniko-build.py
Normal file
196
linux/ecosystem/atlassian/bitbucket/9/9.0.0/kaniko-build.py
Normal file
@ -0,0 +1,196 @@
|
||||
import os
|
||||
import shutil
|
||||
import argparse
|
||||
import yaml
|
||||
import subprocess
|
||||
from collections import defaultdict
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
from dotenv import load_dotenv
|
||||
import logging
|
||||
import sys
|
||||
|
||||
# Script version
|
||||
SCRIPT_VERSION = "1.0.1.0"
|
||||
|
||||
# ASCII art for EpicMorg
|
||||
ASCII_ART = r"""
|
||||
+=================================================+
|
||||
| ____| _) \ | |
|
||||
| __| __ \ | __| |\/ | _ \ __| _` | |
|
||||
| | | | | ( | | ( | | ( | |
|
||||
|_____| .__/ _| \___| _| _| \___/ _| \__, | |
|
||||
| | / _| _) | |___/ |
|
||||
| ' / _` | __ \ | | / _ \ |
|
||||
| . \ ( | | | | < ( | |
|
||||
|_|\_\ \__,_| _| _| _| _|\_\ \___/ |
|
||||
|\ \ / |
|
||||
| \ \ \ / __| _` | __ \ __ \ _ \ __||
|
||||
| \ \ \ / | ( | | | | | __/ | |
|
||||
| \_/\_/ _| \__,_| .__/ .__/ \___| _| |
|
||||
| _| _| |
|
||||
+=================================================+
|
||||
"""
|
||||
|
||||
# Load environment variables from .env file
|
||||
load_dotenv()
|
||||
|
||||
def setup_logging():
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
|
||||
def parse_args():
|
||||
parser = argparse.ArgumentParser(description="EpicMorg: Kaniko-Compose Wrapper", add_help=False)
|
||||
parser.add_argument('--compose-file', default=os.getenv('COMPOSE_FILE', 'docker-compose.yml'), help='Path to docker-compose.yml file')
|
||||
parser.add_argument('--kaniko-image', default=os.getenv('KANIKO_IMAGE', 'gcr.io/kaniko-project/executor:latest'), help='Kaniko executor image')
|
||||
parser.add_argument('--push', '--deploy', '-d', '-p', action='store_true', help='Deploy the built images to the registry')
|
||||
parser.add_argument('--dry-run', '--dry', action='store_true', help='Dry run: build images without pushing and with cleanup')
|
||||
parser.add_argument('--version', '-v', action='store_true', help='Show script version')
|
||||
parser.add_argument('--help', '-h', action='store_true', help='Show this help message and exit')
|
||||
return parser.parse_args()
|
||||
|
||||
def load_compose_file(file_path):
|
||||
with open(file_path, 'r') as file:
|
||||
return yaml.safe_load(file)
|
||||
|
||||
def build_with_kaniko(service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry):
|
||||
kaniko_command = [
|
||||
'docker', 'run',
|
||||
'--rm',
|
||||
'-t',
|
||||
'-v', f'{os.path.abspath(build_context)}:/workspace',
|
||||
]
|
||||
|
||||
# Add Docker config mounts for both read-only access
|
||||
kaniko_command.extend([
|
||||
'-v', '/var/run/docker.sock:/var/run/docker.sock:ro', # Access to Docker daemon
|
||||
'-v', f'{os.path.expanduser("~")}/.docker:/kaniko/.docker:ro', # Use existing Docker credentials in read-only mode
|
||||
])
|
||||
|
||||
kaniko_command.extend([
|
||||
kaniko_image,
|
||||
'--context', '/workspace',
|
||||
'--dockerfile', f'/workspace/{dockerfile}',
|
||||
'--compressed-caching',
|
||||
'--single-snapshot',
|
||||
'--cleanup'
|
||||
])
|
||||
|
||||
if deploy:
|
||||
kaniko_command.extend([
|
||||
'--destination', image_name
|
||||
])
|
||||
elif dry:
|
||||
kaniko_command.extend([
|
||||
'--no-push'
|
||||
])
|
||||
else:
|
||||
kaniko_command.extend([
|
||||
'--no-push'
|
||||
])
|
||||
|
||||
# Add build arguments if they exist
|
||||
for arg_name, arg_value in build_args.items():
|
||||
kaniko_command.extend(['--build-arg', f'{arg_name}={arg_value}'])
|
||||
|
||||
logging.info(f"Building {service_name} with Kaniko: {' '.join(kaniko_command)}")
|
||||
|
||||
process = subprocess.Popen(kaniko_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
||||
|
||||
# Stream output in real-time
|
||||
for line in process.stdout:
|
||||
logging.info(line.strip())
|
||||
|
||||
process.wait()
|
||||
|
||||
if process.returncode == 0:
|
||||
logging.info(f"Successfully built {service_name}")
|
||||
else:
|
||||
for line in process.stderr:
|
||||
logging.error(line.strip())
|
||||
logging.error(f"Error building {service_name}")
|
||||
raise Exception(f"Failed to build {service_name}")
|
||||
|
||||
def show_help():
|
||||
print(ASCII_ART)
|
||||
print("EpicMorg: Kaniko-Compose Wrapper\n")
|
||||
print("Arguments:")
|
||||
print("--compose-file Path to docker-compose.yml file")
|
||||
print("--kaniko-image Kaniko executor image")
|
||||
print("--push, --deploy, -d, -p Deploy the built images to the registry")
|
||||
print("--dry-run, --dry Dry run: build images without pushing and with cleanup")
|
||||
print("--version, -v Show script version")
|
||||
print("--help, -h Show this help message and exit")
|
||||
|
||||
def show_version():
|
||||
print(ASCII_ART)
|
||||
print(f"EpicMorg: Kaniko-Compose Wrapper {SCRIPT_VERSION}, Python: {sys.version}")
|
||||
|
||||
def main():
|
||||
setup_logging()
|
||||
|
||||
args = parse_args()
|
||||
|
||||
# Show help and exit if --help is provided
|
||||
if args.help:
|
||||
show_help()
|
||||
return
|
||||
|
||||
# Show version and exit if --version or no relevant arguments are provided
|
||||
if args.version or not (args.push or args.dry_run or args.compose_file != 'docker-compose.yml' or args.kaniko_image != 'gcr.io/kaniko-project/executor:latest'):
|
||||
show_version()
|
||||
return
|
||||
|
||||
compose_file = args.compose_file
|
||||
kaniko_image = args.kaniko_image
|
||||
deploy = args.push
|
||||
dry = args.dry_run
|
||||
|
||||
if not os.path.exists(compose_file):
|
||||
logging.error(f"{compose_file} not found")
|
||||
return
|
||||
|
||||
compose_data = load_compose_file(compose_file)
|
||||
|
||||
services = compose_data.get('services', {})
|
||||
image_names = defaultdict(int)
|
||||
|
||||
for service_name, service_data in services.items():
|
||||
image_name = service_data.get('image')
|
||||
|
||||
if not image_name:
|
||||
logging.warning(f"No image specified for service {service_name}")
|
||||
continue
|
||||
|
||||
image_names[image_name] += 1
|
||||
|
||||
for image_name, count in image_names.items():
|
||||
if count > 1:
|
||||
logging.error(f"Error: Image name {image_name} is used {count} times.")
|
||||
return
|
||||
|
||||
try:
|
||||
with ThreadPoolExecutor() as executor:
|
||||
futures = []
|
||||
for service_name, service_data in services.items():
|
||||
build_data = service_data.get('build', {})
|
||||
build_context = build_data.get('context', '.')
|
||||
dockerfile = build_data.get('dockerfile', 'Dockerfile')
|
||||
image_name = service_data.get('image')
|
||||
build_args = build_data.get('args', {})
|
||||
|
||||
# Substitute environment variables with their values if they exist
|
||||
build_args = {key: os.getenv(key, value) for key, value in build_args.items()}
|
||||
|
||||
if not image_name:
|
||||
logging.warning(f"No image specified for service {service_name}")
|
||||
continue
|
||||
|
||||
futures.append(executor.submit(build_with_kaniko, service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry))
|
||||
|
||||
for future in as_completed(futures):
|
||||
future.result()
|
||||
except Exception as exc:
|
||||
logging.error(f"Build failed: {exc}")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -0,0 +1,2 @@
|
||||
PyYAML
|
||||
python-dotenv
|
48
linux/ecosystem/atlassian/confluence/8/8.8.1/Dockerfile
Normal file
48
linux/ecosystem/atlassian/confluence/8/8.8.1/Dockerfile
Normal file
@ -0,0 +1,48 @@
|
||||
FROM epicmorg/debian:bookworm-jdk11
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
ARG RELEASE=8.8.1
|
||||
ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html
|
||||
ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence
|
||||
ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence
|
||||
|
||||
VOLUME ["${CONFLUENCE_HOME}"]
|
||||
WORKDIR $CONFLUENCE_HOME
|
||||
|
||||
# Expose HTTP and Synchrony ports
|
||||
EXPOSE 8090
|
||||
EXPOSE 8091
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \
|
||||
&& curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
@ -0,0 +1,49 @@
|
||||
FROM epicmorg/debian:bookworm-jdk11
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
ARG RELEASE=8.8.1
|
||||
ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html
|
||||
ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence
|
||||
ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence
|
||||
|
||||
VOLUME ["${CONFLUENCE_HOME}"]
|
||||
WORKDIR $CONFLUENCE_HOME
|
||||
|
||||
# Expose HTTP and Synchrony ports
|
||||
EXPOSE 8090
|
||||
EXPOSE 8091
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \
|
||||
&& curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \
|
||||
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
@ -0,0 +1,49 @@
|
||||
FROM epicmorg/debian:bookworm-jdk17
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
ARG RELEASE=8.8.1
|
||||
ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html
|
||||
ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence
|
||||
ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence
|
||||
|
||||
VOLUME ["${CONFLUENCE_HOME}"]
|
||||
WORKDIR $CONFLUENCE_HOME
|
||||
|
||||
# Expose HTTP and Synchrony ports
|
||||
EXPOSE 8090
|
||||
EXPOSE 8091
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \
|
||||
&& curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \
|
||||
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
50
linux/ecosystem/atlassian/confluence/8/8.8.1/Makefile
Normal file
50
linux/ecosystem/atlassian/confluence/8/8.8.1/Makefile
Normal file
@ -0,0 +1,50 @@
|
||||
PIP_BREAK_SYSTEM_PACKAGES=1
|
||||
|
||||
all: app
|
||||
|
||||
app:
|
||||
make build
|
||||
make deploy
|
||||
make clean
|
||||
|
||||
build:
|
||||
make pip
|
||||
python3 kaniko-build.py --version
|
||||
|
||||
dry:
|
||||
make dry-run
|
||||
|
||||
test:
|
||||
make dry-run
|
||||
|
||||
dry-run:
|
||||
python3 kaniko-build.py --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug --dry-run
|
||||
|
||||
pip:
|
||||
rm -rf /usr/lib/python3.6/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.7/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.8/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.13/EXTERNALLY-MANAGED
|
||||
pip3 install -r requirements.txt
|
||||
pip install -r requirements.txt
|
||||
|
||||
build-compose:
|
||||
docker-compose build --compress --parallel --progress plain
|
||||
|
||||
deploy:
|
||||
make pip
|
||||
python3 kaniko-build.py --deploy --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug
|
||||
|
||||
deploy-compose:
|
||||
docker-compose push
|
||||
|
||||
clean:
|
||||
docker container prune -f
|
||||
docker image prune -f
|
||||
docker network prune -f
|
||||
docker volume prune -f
|
||||
docker system prune -af
|
@ -0,0 +1,17 @@
|
||||
#version: '3'
|
||||
services:
|
||||
app:
|
||||
image: "epicmorg/confluence:8.8.1"
|
||||
build:
|
||||
context: .
|
||||
app-jdk11:
|
||||
image: "epicmorg/confluence:8.8.1-jdk11"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.jdk11
|
||||
app-jdk17:
|
||||
image: "epicmorg/confluence:8.8.1-jdk17"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.jdk17
|
||||
|
39
linux/ecosystem/atlassian/confluence/8/8.8.1/entrypoint.sh
Executable file
39
linux/ecosystem/atlassian/confluence/8/8.8.1/entrypoint.sh
Executable file
@ -0,0 +1,39 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
|
||||
export JRE_HOME="$JAVA_HOME/jre"
|
||||
export JAVA_BINARY="$JRE_HOME/bin/java"
|
||||
export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}')
|
||||
|
||||
|
||||
# Setup Catalina Opts
|
||||
: ${CATALINA_CONNECTOR_PROXYNAME:=}
|
||||
: ${CATALINA_CONNECTOR_PROXYPORT:=}
|
||||
: ${CATALINA_CONNECTOR_SCHEME:=http}
|
||||
: ${CATALINA_CONNECTOR_SECURE:=false}
|
||||
|
||||
: ${CATALINA_OPTS:=}
|
||||
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}"
|
||||
|
||||
export CATALINA_OPTS
|
||||
|
||||
|
||||
# Start Confluence as the correct user
|
||||
if [ "${UID}" -eq 0 ]; then
|
||||
echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}"
|
||||
PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${CONFLUENCE_HOME}")
|
||||
EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700
|
||||
if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then
|
||||
chmod -R 700 "${CONFLUENCE_HOME}" &&
|
||||
chown -R "${RUN_USER}:${RUN_GROUP}" "${CONFLUENCE_HOME}"
|
||||
fi
|
||||
# Now drop privileges
|
||||
exec su -s /bin/bash "${RUN_USER}" -c "$CONFLUENCE_INSTALL_DIR/bin/start-confluence.sh $@"
|
||||
else
|
||||
exec "$CONFLUENCE_INSTALL_DIR/bin/start-confluence.sh" "$@"
|
||||
fi
|
196
linux/ecosystem/atlassian/confluence/8/8.8.1/kaniko-build.py
Normal file
196
linux/ecosystem/atlassian/confluence/8/8.8.1/kaniko-build.py
Normal file
@ -0,0 +1,196 @@
|
||||
import os
|
||||
import shutil
|
||||
import argparse
|
||||
import yaml
|
||||
import subprocess
|
||||
from collections import defaultdict
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
from dotenv import load_dotenv
|
||||
import logging
|
||||
import sys
|
||||
|
||||
# Script version
|
||||
SCRIPT_VERSION = "1.0.1.0"
|
||||
|
||||
# ASCII art for EpicMorg
|
||||
ASCII_ART = r"""
|
||||
+=================================================+
|
||||
| ____| _) \ | |
|
||||
| __| __ \ | __| |\/ | _ \ __| _` | |
|
||||
| | | | | ( | | ( | | ( | |
|
||||
|_____| .__/ _| \___| _| _| \___/ _| \__, | |
|
||||
| | / _| _) | |___/ |
|
||||
| ' / _` | __ \ | | / _ \ |
|
||||
| . \ ( | | | | < ( | |
|
||||
|_|\_\ \__,_| _| _| _| _|\_\ \___/ |
|
||||
|\ \ / |
|
||||
| \ \ \ / __| _` | __ \ __ \ _ \ __||
|
||||
| \ \ \ / | ( | | | | | __/ | |
|
||||
| \_/\_/ _| \__,_| .__/ .__/ \___| _| |
|
||||
| _| _| |
|
||||
+=================================================+
|
||||
"""
|
||||
|
||||
# Load environment variables from .env file
|
||||
load_dotenv()
|
||||
|
||||
def setup_logging():
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
|
||||
def parse_args():
|
||||
parser = argparse.ArgumentParser(description="EpicMorg: Kaniko-Compose Wrapper", add_help=False)
|
||||
parser.add_argument('--compose-file', default=os.getenv('COMPOSE_FILE', 'docker-compose.yml'), help='Path to docker-compose.yml file')
|
||||
parser.add_argument('--kaniko-image', default=os.getenv('KANIKO_IMAGE', 'gcr.io/kaniko-project/executor:latest'), help='Kaniko executor image')
|
||||
parser.add_argument('--push', '--deploy', '-d', '-p', action='store_true', help='Deploy the built images to the registry')
|
||||
parser.add_argument('--dry-run', '--dry', action='store_true', help='Dry run: build images without pushing and with cleanup')
|
||||
parser.add_argument('--version', '-v', action='store_true', help='Show script version')
|
||||
parser.add_argument('--help', '-h', action='store_true', help='Show this help message and exit')
|
||||
return parser.parse_args()
|
||||
|
||||
def load_compose_file(file_path):
|
||||
with open(file_path, 'r') as file:
|
||||
return yaml.safe_load(file)
|
||||
|
||||
def build_with_kaniko(service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry):
|
||||
kaniko_command = [
|
||||
'docker', 'run',
|
||||
'--rm',
|
||||
'-t',
|
||||
'-v', f'{os.path.abspath(build_context)}:/workspace',
|
||||
]
|
||||
|
||||
# Add Docker config mounts for both read-only access
|
||||
kaniko_command.extend([
|
||||
'-v', '/var/run/docker.sock:/var/run/docker.sock:ro', # Access to Docker daemon
|
||||
'-v', f'{os.path.expanduser("~")}/.docker:/kaniko/.docker:ro', # Use existing Docker credentials in read-only mode
|
||||
])
|
||||
|
||||
kaniko_command.extend([
|
||||
kaniko_image,
|
||||
'--context', '/workspace',
|
||||
'--dockerfile', f'/workspace/{dockerfile}',
|
||||
'--compressed-caching',
|
||||
'--single-snapshot',
|
||||
'--cleanup'
|
||||
])
|
||||
|
||||
if deploy:
|
||||
kaniko_command.extend([
|
||||
'--destination', image_name
|
||||
])
|
||||
elif dry:
|
||||
kaniko_command.extend([
|
||||
'--no-push'
|
||||
])
|
||||
else:
|
||||
kaniko_command.extend([
|
||||
'--no-push'
|
||||
])
|
||||
|
||||
# Add build arguments if they exist
|
||||
for arg_name, arg_value in build_args.items():
|
||||
kaniko_command.extend(['--build-arg', f'{arg_name}={arg_value}'])
|
||||
|
||||
logging.info(f"Building {service_name} with Kaniko: {' '.join(kaniko_command)}")
|
||||
|
||||
process = subprocess.Popen(kaniko_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
||||
|
||||
# Stream output in real-time
|
||||
for line in process.stdout:
|
||||
logging.info(line.strip())
|
||||
|
||||
process.wait()
|
||||
|
||||
if process.returncode == 0:
|
||||
logging.info(f"Successfully built {service_name}")
|
||||
else:
|
||||
for line in process.stderr:
|
||||
logging.error(line.strip())
|
||||
logging.error(f"Error building {service_name}")
|
||||
raise Exception(f"Failed to build {service_name}")
|
||||
|
||||
def show_help():
|
||||
print(ASCII_ART)
|
||||
print("EpicMorg: Kaniko-Compose Wrapper\n")
|
||||
print("Arguments:")
|
||||
print("--compose-file Path to docker-compose.yml file")
|
||||
print("--kaniko-image Kaniko executor image")
|
||||
print("--push, --deploy, -d, -p Deploy the built images to the registry")
|
||||
print("--dry-run, --dry Dry run: build images without pushing and with cleanup")
|
||||
print("--version, -v Show script version")
|
||||
print("--help, -h Show this help message and exit")
|
||||
|
||||
def show_version():
|
||||
print(ASCII_ART)
|
||||
print(f"EpicMorg: Kaniko-Compose Wrapper {SCRIPT_VERSION}, Python: {sys.version}")
|
||||
|
||||
def main():
|
||||
setup_logging()
|
||||
|
||||
args = parse_args()
|
||||
|
||||
# Show help and exit if --help is provided
|
||||
if args.help:
|
||||
show_help()
|
||||
return
|
||||
|
||||
# Show version and exit if --version or no relevant arguments are provided
|
||||
if args.version or not (args.push or args.dry_run or args.compose_file != 'docker-compose.yml' or args.kaniko_image != 'gcr.io/kaniko-project/executor:latest'):
|
||||
show_version()
|
||||
return
|
||||
|
||||
compose_file = args.compose_file
|
||||
kaniko_image = args.kaniko_image
|
||||
deploy = args.push
|
||||
dry = args.dry_run
|
||||
|
||||
if not os.path.exists(compose_file):
|
||||
logging.error(f"{compose_file} not found")
|
||||
return
|
||||
|
||||
compose_data = load_compose_file(compose_file)
|
||||
|
||||
services = compose_data.get('services', {})
|
||||
image_names = defaultdict(int)
|
||||
|
||||
for service_name, service_data in services.items():
|
||||
image_name = service_data.get('image')
|
||||
|
||||
if not image_name:
|
||||
logging.warning(f"No image specified for service {service_name}")
|
||||
continue
|
||||
|
||||
image_names[image_name] += 1
|
||||
|
||||
for image_name, count in image_names.items():
|
||||
if count > 1:
|
||||
logging.error(f"Error: Image name {image_name} is used {count} times.")
|
||||
return
|
||||
|
||||
try:
|
||||
with ThreadPoolExecutor() as executor:
|
||||
futures = []
|
||||
for service_name, service_data in services.items():
|
||||
build_data = service_data.get('build', {})
|
||||
build_context = build_data.get('context', '.')
|
||||
dockerfile = build_data.get('dockerfile', 'Dockerfile')
|
||||
image_name = service_data.get('image')
|
||||
build_args = build_data.get('args', {})
|
||||
|
||||
# Substitute environment variables with their values if they exist
|
||||
build_args = {key: os.getenv(key, value) for key, value in build_args.items()}
|
||||
|
||||
if not image_name:
|
||||
logging.warning(f"No image specified for service {service_name}")
|
||||
continue
|
||||
|
||||
futures.append(executor.submit(build_with_kaniko, service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry))
|
||||
|
||||
for future in as_completed(futures):
|
||||
future.result()
|
||||
except Exception as exc:
|
||||
logging.error(f"Build failed: {exc}")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -0,0 +1,2 @@
|
||||
PyYAML
|
||||
python-dotenv
|
48
linux/ecosystem/atlassian/confluence/8/8.9.5/Dockerfile
Normal file
48
linux/ecosystem/atlassian/confluence/8/8.9.5/Dockerfile
Normal file
@ -0,0 +1,48 @@
|
||||
FROM epicmorg/debian:bookworm-jdk11
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
ARG RELEASE=8.9.5
|
||||
ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html
|
||||
ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence
|
||||
ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence
|
||||
|
||||
VOLUME ["${CONFLUENCE_HOME}"]
|
||||
WORKDIR $CONFLUENCE_HOME
|
||||
|
||||
# Expose HTTP and Synchrony ports
|
||||
EXPOSE 8090
|
||||
EXPOSE 8091
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \
|
||||
&& curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
@ -0,0 +1,49 @@
|
||||
FROM epicmorg/debian:bookworm-jdk11
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
ARG RELEASE=8.9.5
|
||||
ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html
|
||||
ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence
|
||||
ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence
|
||||
|
||||
VOLUME ["${CONFLUENCE_HOME}"]
|
||||
WORKDIR $CONFLUENCE_HOME
|
||||
|
||||
# Expose HTTP and Synchrony ports
|
||||
EXPOSE 8090
|
||||
EXPOSE 8091
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \
|
||||
&& curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \
|
||||
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
@ -0,0 +1,49 @@
|
||||
FROM epicmorg/debian:bookworm-jdk17
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
ARG RELEASE=8.9.5
|
||||
ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html
|
||||
ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence
|
||||
ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence
|
||||
|
||||
VOLUME ["${CONFLUENCE_HOME}"]
|
||||
WORKDIR $CONFLUENCE_HOME
|
||||
|
||||
# Expose HTTP and Synchrony ports
|
||||
EXPOSE 8090
|
||||
EXPOSE 8091
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \
|
||||
&& curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \
|
||||
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
50
linux/ecosystem/atlassian/confluence/8/8.9.5/Makefile
Normal file
50
linux/ecosystem/atlassian/confluence/8/8.9.5/Makefile
Normal file
@ -0,0 +1,50 @@
|
||||
PIP_BREAK_SYSTEM_PACKAGES=1
|
||||
|
||||
all: app
|
||||
|
||||
app:
|
||||
make build
|
||||
make deploy
|
||||
make clean
|
||||
|
||||
build:
|
||||
make pip
|
||||
python3 kaniko-build.py --version
|
||||
|
||||
dry:
|
||||
make dry-run
|
||||
|
||||
test:
|
||||
make dry-run
|
||||
|
||||
dry-run:
|
||||
python3 kaniko-build.py --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug --dry-run
|
||||
|
||||
pip:
|
||||
rm -rf /usr/lib/python3.6/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.7/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.8/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.13/EXTERNALLY-MANAGED
|
||||
pip3 install -r requirements.txt
|
||||
pip install -r requirements.txt
|
||||
|
||||
build-compose:
|
||||
docker-compose build --compress --parallel --progress plain
|
||||
|
||||
deploy:
|
||||
make pip
|
||||
python3 kaniko-build.py --deploy --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug
|
||||
|
||||
deploy-compose:
|
||||
docker-compose push
|
||||
|
||||
clean:
|
||||
docker container prune -f
|
||||
docker image prune -f
|
||||
docker network prune -f
|
||||
docker volume prune -f
|
||||
docker system prune -af
|
@ -0,0 +1,16 @@
|
||||
#version: '3'
|
||||
services:
|
||||
app:
|
||||
image: "epicmorg/confluence:8.9.5"
|
||||
build:
|
||||
context: .
|
||||
app-jdk11:
|
||||
image: "epicmorg/confluence:8.9.5-jdk11"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.jdk11
|
||||
app-jdk17:
|
||||
image: "epicmorg/confluence:8.9.5-jdk17"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.jdk17
|
39
linux/ecosystem/atlassian/confluence/8/8.9.5/entrypoint.sh
Executable file
39
linux/ecosystem/atlassian/confluence/8/8.9.5/entrypoint.sh
Executable file
@ -0,0 +1,39 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
|
||||
export JRE_HOME="$JAVA_HOME/jre"
|
||||
export JAVA_BINARY="$JRE_HOME/bin/java"
|
||||
export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}')
|
||||
|
||||
|
||||
# Setup Catalina Opts
|
||||
: ${CATALINA_CONNECTOR_PROXYNAME:=}
|
||||
: ${CATALINA_CONNECTOR_PROXYPORT:=}
|
||||
: ${CATALINA_CONNECTOR_SCHEME:=http}
|
||||
: ${CATALINA_CONNECTOR_SECURE:=false}
|
||||
|
||||
: ${CATALINA_OPTS:=}
|
||||
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}"
|
||||
|
||||
export CATALINA_OPTS
|
||||
|
||||
|
||||
# Start Confluence as the correct user
|
||||
if [ "${UID}" -eq 0 ]; then
|
||||
echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}"
|
||||
PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${CONFLUENCE_HOME}")
|
||||
EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700
|
||||
if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then
|
||||
chmod -R 700 "${CONFLUENCE_HOME}" &&
|
||||
chown -R "${RUN_USER}:${RUN_GROUP}" "${CONFLUENCE_HOME}"
|
||||
fi
|
||||
# Now drop privileges
|
||||
exec su -s /bin/bash "${RUN_USER}" -c "$CONFLUENCE_INSTALL_DIR/bin/start-confluence.sh $@"
|
||||
else
|
||||
exec "$CONFLUENCE_INSTALL_DIR/bin/start-confluence.sh" "$@"
|
||||
fi
|
196
linux/ecosystem/atlassian/confluence/8/8.9.5/kaniko-build.py
Normal file
196
linux/ecosystem/atlassian/confluence/8/8.9.5/kaniko-build.py
Normal file
@ -0,0 +1,196 @@
|
||||
import os
|
||||
import shutil
|
||||
import argparse
|
||||
import yaml
|
||||
import subprocess
|
||||
from collections import defaultdict
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
from dotenv import load_dotenv
|
||||
import logging
|
||||
import sys
|
||||
|
||||
# Script version
|
||||
SCRIPT_VERSION = "1.0.1.0"
|
||||
|
||||
# ASCII art for EpicMorg
|
||||
ASCII_ART = r"""
|
||||
+=================================================+
|
||||
| ____| _) \ | |
|
||||
| __| __ \ | __| |\/ | _ \ __| _` | |
|
||||
| | | | | ( | | ( | | ( | |
|
||||
|_____| .__/ _| \___| _| _| \___/ _| \__, | |
|
||||
| | / _| _) | |___/ |
|
||||
| ' / _` | __ \ | | / _ \ |
|
||||
| . \ ( | | | | < ( | |
|
||||
|_|\_\ \__,_| _| _| _| _|\_\ \___/ |
|
||||
|\ \ / |
|
||||
| \ \ \ / __| _` | __ \ __ \ _ \ __||
|
||||
| \ \ \ / | ( | | | | | __/ | |
|
||||
| \_/\_/ _| \__,_| .__/ .__/ \___| _| |
|
||||
| _| _| |
|
||||
+=================================================+
|
||||
"""
|
||||
|
||||
# Load environment variables from .env file
|
||||
load_dotenv()
|
||||
|
||||
def setup_logging():
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
|
||||
def parse_args():
|
||||
parser = argparse.ArgumentParser(description="EpicMorg: Kaniko-Compose Wrapper", add_help=False)
|
||||
parser.add_argument('--compose-file', default=os.getenv('COMPOSE_FILE', 'docker-compose.yml'), help='Path to docker-compose.yml file')
|
||||
parser.add_argument('--kaniko-image', default=os.getenv('KANIKO_IMAGE', 'gcr.io/kaniko-project/executor:latest'), help='Kaniko executor image')
|
||||
parser.add_argument('--push', '--deploy', '-d', '-p', action='store_true', help='Deploy the built images to the registry')
|
||||
parser.add_argument('--dry-run', '--dry', action='store_true', help='Dry run: build images without pushing and with cleanup')
|
||||
parser.add_argument('--version', '-v', action='store_true', help='Show script version')
|
||||
parser.add_argument('--help', '-h', action='store_true', help='Show this help message and exit')
|
||||
return parser.parse_args()
|
||||
|
||||
def load_compose_file(file_path):
|
||||
with open(file_path, 'r') as file:
|
||||
return yaml.safe_load(file)
|
||||
|
||||
def build_with_kaniko(service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry):
|
||||
kaniko_command = [
|
||||
'docker', 'run',
|
||||
'--rm',
|
||||
'-t',
|
||||
'-v', f'{os.path.abspath(build_context)}:/workspace',
|
||||
]
|
||||
|
||||
# Add Docker config mounts for both read-only access
|
||||
kaniko_command.extend([
|
||||
'-v', '/var/run/docker.sock:/var/run/docker.sock:ro', # Access to Docker daemon
|
||||
'-v', f'{os.path.expanduser("~")}/.docker:/kaniko/.docker:ro', # Use existing Docker credentials in read-only mode
|
||||
])
|
||||
|
||||
kaniko_command.extend([
|
||||
kaniko_image,
|
||||
'--context', '/workspace',
|
||||
'--dockerfile', f'/workspace/{dockerfile}',
|
||||
'--compressed-caching',
|
||||
'--single-snapshot',
|
||||
'--cleanup'
|
||||
])
|
||||
|
||||
if deploy:
|
||||
kaniko_command.extend([
|
||||
'--destination', image_name
|
||||
])
|
||||
elif dry:
|
||||
kaniko_command.extend([
|
||||
'--no-push'
|
||||
])
|
||||
else:
|
||||
kaniko_command.extend([
|
||||
'--no-push'
|
||||
])
|
||||
|
||||
# Add build arguments if they exist
|
||||
for arg_name, arg_value in build_args.items():
|
||||
kaniko_command.extend(['--build-arg', f'{arg_name}={arg_value}'])
|
||||
|
||||
logging.info(f"Building {service_name} with Kaniko: {' '.join(kaniko_command)}")
|
||||
|
||||
process = subprocess.Popen(kaniko_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
||||
|
||||
# Stream output in real-time
|
||||
for line in process.stdout:
|
||||
logging.info(line.strip())
|
||||
|
||||
process.wait()
|
||||
|
||||
if process.returncode == 0:
|
||||
logging.info(f"Successfully built {service_name}")
|
||||
else:
|
||||
for line in process.stderr:
|
||||
logging.error(line.strip())
|
||||
logging.error(f"Error building {service_name}")
|
||||
raise Exception(f"Failed to build {service_name}")
|
||||
|
||||
def show_help():
|
||||
print(ASCII_ART)
|
||||
print("EpicMorg: Kaniko-Compose Wrapper\n")
|
||||
print("Arguments:")
|
||||
print("--compose-file Path to docker-compose.yml file")
|
||||
print("--kaniko-image Kaniko executor image")
|
||||
print("--push, --deploy, -d, -p Deploy the built images to the registry")
|
||||
print("--dry-run, --dry Dry run: build images without pushing and with cleanup")
|
||||
print("--version, -v Show script version")
|
||||
print("--help, -h Show this help message and exit")
|
||||
|
||||
def show_version():
|
||||
print(ASCII_ART)
|
||||
print(f"EpicMorg: Kaniko-Compose Wrapper {SCRIPT_VERSION}, Python: {sys.version}")
|
||||
|
||||
def main():
|
||||
setup_logging()
|
||||
|
||||
args = parse_args()
|
||||
|
||||
# Show help and exit if --help is provided
|
||||
if args.help:
|
||||
show_help()
|
||||
return
|
||||
|
||||
# Show version and exit if --version or no relevant arguments are provided
|
||||
if args.version or not (args.push or args.dry_run or args.compose_file != 'docker-compose.yml' or args.kaniko_image != 'gcr.io/kaniko-project/executor:latest'):
|
||||
show_version()
|
||||
return
|
||||
|
||||
compose_file = args.compose_file
|
||||
kaniko_image = args.kaniko_image
|
||||
deploy = args.push
|
||||
dry = args.dry_run
|
||||
|
||||
if not os.path.exists(compose_file):
|
||||
logging.error(f"{compose_file} not found")
|
||||
return
|
||||
|
||||
compose_data = load_compose_file(compose_file)
|
||||
|
||||
services = compose_data.get('services', {})
|
||||
image_names = defaultdict(int)
|
||||
|
||||
for service_name, service_data in services.items():
|
||||
image_name = service_data.get('image')
|
||||
|
||||
if not image_name:
|
||||
logging.warning(f"No image specified for service {service_name}")
|
||||
continue
|
||||
|
||||
image_names[image_name] += 1
|
||||
|
||||
for image_name, count in image_names.items():
|
||||
if count > 1:
|
||||
logging.error(f"Error: Image name {image_name} is used {count} times.")
|
||||
return
|
||||
|
||||
try:
|
||||
with ThreadPoolExecutor() as executor:
|
||||
futures = []
|
||||
for service_name, service_data in services.items():
|
||||
build_data = service_data.get('build', {})
|
||||
build_context = build_data.get('context', '.')
|
||||
dockerfile = build_data.get('dockerfile', 'Dockerfile')
|
||||
image_name = service_data.get('image')
|
||||
build_args = build_data.get('args', {})
|
||||
|
||||
# Substitute environment variables with their values if they exist
|
||||
build_args = {key: os.getenv(key, value) for key, value in build_args.items()}
|
||||
|
||||
if not image_name:
|
||||
logging.warning(f"No image specified for service {service_name}")
|
||||
continue
|
||||
|
||||
futures.append(executor.submit(build_with_kaniko, service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry))
|
||||
|
||||
for future in as_completed(futures):
|
||||
future.result()
|
||||
except Exception as exc:
|
||||
logging.error(f"Build failed: {exc}")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -0,0 +1,2 @@
|
||||
PyYAML
|
||||
python-dotenv
|
48
linux/ecosystem/atlassian/confluence/9/9.0.0/Dockerfile
Normal file
48
linux/ecosystem/atlassian/confluence/9/9.0.0/Dockerfile
Normal file
@ -0,0 +1,48 @@
|
||||
FROM epicmorg/debian:bookworm-jdk11
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
ARG RELEASE=9.0.0
|
||||
ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html
|
||||
ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence
|
||||
ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence
|
||||
|
||||
VOLUME ["${CONFLUENCE_HOME}"]
|
||||
WORKDIR $CONFLUENCE_HOME
|
||||
|
||||
# Expose HTTP and Synchrony ports
|
||||
EXPOSE 8090
|
||||
EXPOSE 8091
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \
|
||||
&& curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
@ -0,0 +1,49 @@
|
||||
FROM epicmorg/debian:bookworm-jdk11
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
ARG RELEASE=9.0.0
|
||||
ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html
|
||||
ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence
|
||||
ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence
|
||||
|
||||
VOLUME ["${CONFLUENCE_HOME}"]
|
||||
WORKDIR $CONFLUENCE_HOME
|
||||
|
||||
# Expose HTTP and Synchrony ports
|
||||
EXPOSE 8090
|
||||
EXPOSE 8091
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \
|
||||
&& curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \
|
||||
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
@ -0,0 +1,49 @@
|
||||
FROM epicmorg/debian:bookworm-jdk17
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
ARG RELEASE=9.0.0
|
||||
ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html
|
||||
ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence
|
||||
ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence
|
||||
|
||||
VOLUME ["${CONFLUENCE_HOME}"]
|
||||
WORKDIR $CONFLUENCE_HOME
|
||||
|
||||
# Expose HTTP and Synchrony ports
|
||||
EXPOSE 8090
|
||||
EXPOSE 8091
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \
|
||||
&& curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \
|
||||
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
50
linux/ecosystem/atlassian/confluence/9/9.0.0/Makefile
Normal file
50
linux/ecosystem/atlassian/confluence/9/9.0.0/Makefile
Normal file
@ -0,0 +1,50 @@
|
||||
PIP_BREAK_SYSTEM_PACKAGES=1
|
||||
|
||||
all: app
|
||||
|
||||
app:
|
||||
make build
|
||||
make deploy
|
||||
make clean
|
||||
|
||||
build:
|
||||
make pip
|
||||
python3 kaniko-build.py --version
|
||||
|
||||
dry:
|
||||
make dry-run
|
||||
|
||||
test:
|
||||
make dry-run
|
||||
|
||||
dry-run:
|
||||
python3 kaniko-build.py --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug --dry-run
|
||||
|
||||
pip:
|
||||
rm -rf /usr/lib/python3.6/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.7/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.8/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.13/EXTERNALLY-MANAGED
|
||||
pip3 install -r requirements.txt
|
||||
pip install -r requirements.txt
|
||||
|
||||
build-compose:
|
||||
docker-compose build --compress --parallel --progress plain
|
||||
|
||||
deploy:
|
||||
make pip
|
||||
python3 kaniko-build.py --deploy --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug
|
||||
|
||||
deploy-compose:
|
||||
docker-compose push
|
||||
|
||||
clean:
|
||||
docker container prune -f
|
||||
docker image prune -f
|
||||
docker network prune -f
|
||||
docker volume prune -f
|
||||
docker system prune -af
|
@ -0,0 +1,16 @@
|
||||
#version: '3'
|
||||
services:
|
||||
app:
|
||||
image: "epicmorg/confluence:9.0.0"
|
||||
build:
|
||||
context: .
|
||||
app-jdk11:
|
||||
image: "epicmorg/confluence:9.0.0-jdk11"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.jdk11
|
||||
app-jdk17:
|
||||
image: "epicmorg/confluence:9.0.0-jdk17"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.jdk17
|
39
linux/ecosystem/atlassian/confluence/9/9.0.0/entrypoint.sh
Executable file
39
linux/ecosystem/atlassian/confluence/9/9.0.0/entrypoint.sh
Executable file
@ -0,0 +1,39 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
|
||||
export JRE_HOME="$JAVA_HOME/jre"
|
||||
export JAVA_BINARY="$JRE_HOME/bin/java"
|
||||
export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}')
|
||||
|
||||
|
||||
# Setup Catalina Opts
|
||||
: ${CATALINA_CONNECTOR_PROXYNAME:=}
|
||||
: ${CATALINA_CONNECTOR_PROXYPORT:=}
|
||||
: ${CATALINA_CONNECTOR_SCHEME:=http}
|
||||
: ${CATALINA_CONNECTOR_SECURE:=false}
|
||||
|
||||
: ${CATALINA_OPTS:=}
|
||||
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}"
|
||||
|
||||
export CATALINA_OPTS
|
||||
|
||||
|
||||
# Start Confluence as the correct user
|
||||
if [ "${UID}" -eq 0 ]; then
|
||||
echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}"
|
||||
PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${CONFLUENCE_HOME}")
|
||||
EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700
|
||||
if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then
|
||||
chmod -R 700 "${CONFLUENCE_HOME}" &&
|
||||
chown -R "${RUN_USER}:${RUN_GROUP}" "${CONFLUENCE_HOME}"
|
||||
fi
|
||||
# Now drop privileges
|
||||
exec su -s /bin/bash "${RUN_USER}" -c "$CONFLUENCE_INSTALL_DIR/bin/start-confluence.sh $@"
|
||||
else
|
||||
exec "$CONFLUENCE_INSTALL_DIR/bin/start-confluence.sh" "$@"
|
||||
fi
|
196
linux/ecosystem/atlassian/confluence/9/9.0.0/kaniko-build.py
Normal file
196
linux/ecosystem/atlassian/confluence/9/9.0.0/kaniko-build.py
Normal file
@ -0,0 +1,196 @@
|
||||
import os
|
||||
import shutil
|
||||
import argparse
|
||||
import yaml
|
||||
import subprocess
|
||||
from collections import defaultdict
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
from dotenv import load_dotenv
|
||||
import logging
|
||||
import sys
|
||||
|
||||
# Script version
|
||||
SCRIPT_VERSION = "1.0.1.0"
|
||||
|
||||
# ASCII art for EpicMorg
|
||||
ASCII_ART = r"""
|
||||
+=================================================+
|
||||
| ____| _) \ | |
|
||||
| __| __ \ | __| |\/ | _ \ __| _` | |
|
||||
| | | | | ( | | ( | | ( | |
|
||||
|_____| .__/ _| \___| _| _| \___/ _| \__, | |
|
||||
| | / _| _) | |___/ |
|
||||
| ' / _` | __ \ | | / _ \ |
|
||||
| . \ ( | | | | < ( | |
|
||||
|_|\_\ \__,_| _| _| _| _|\_\ \___/ |
|
||||
|\ \ / |
|
||||
| \ \ \ / __| _` | __ \ __ \ _ \ __||
|
||||
| \ \ \ / | ( | | | | | __/ | |
|
||||
| \_/\_/ _| \__,_| .__/ .__/ \___| _| |
|
||||
| _| _| |
|
||||
+=================================================+
|
||||
"""
|
||||
|
||||
# Load environment variables from .env file
|
||||
load_dotenv()
|
||||
|
||||
def setup_logging():
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
|
||||
def parse_args():
|
||||
parser = argparse.ArgumentParser(description="EpicMorg: Kaniko-Compose Wrapper", add_help=False)
|
||||
parser.add_argument('--compose-file', default=os.getenv('COMPOSE_FILE', 'docker-compose.yml'), help='Path to docker-compose.yml file')
|
||||
parser.add_argument('--kaniko-image', default=os.getenv('KANIKO_IMAGE', 'gcr.io/kaniko-project/executor:latest'), help='Kaniko executor image')
|
||||
parser.add_argument('--push', '--deploy', '-d', '-p', action='store_true', help='Deploy the built images to the registry')
|
||||
parser.add_argument('--dry-run', '--dry', action='store_true', help='Dry run: build images without pushing and with cleanup')
|
||||
parser.add_argument('--version', '-v', action='store_true', help='Show script version')
|
||||
parser.add_argument('--help', '-h', action='store_true', help='Show this help message and exit')
|
||||
return parser.parse_args()
|
||||
|
||||
def load_compose_file(file_path):
|
||||
with open(file_path, 'r') as file:
|
||||
return yaml.safe_load(file)
|
||||
|
||||
def build_with_kaniko(service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry):
|
||||
kaniko_command = [
|
||||
'docker', 'run',
|
||||
'--rm',
|
||||
'-t',
|
||||
'-v', f'{os.path.abspath(build_context)}:/workspace',
|
||||
]
|
||||
|
||||
# Add Docker config mounts for both read-only access
|
||||
kaniko_command.extend([
|
||||
'-v', '/var/run/docker.sock:/var/run/docker.sock:ro', # Access to Docker daemon
|
||||
'-v', f'{os.path.expanduser("~")}/.docker:/kaniko/.docker:ro', # Use existing Docker credentials in read-only mode
|
||||
])
|
||||
|
||||
kaniko_command.extend([
|
||||
kaniko_image,
|
||||
'--context', '/workspace',
|
||||
'--dockerfile', f'/workspace/{dockerfile}',
|
||||
'--compressed-caching',
|
||||
'--single-snapshot',
|
||||
'--cleanup'
|
||||
])
|
||||
|
||||
if deploy:
|
||||
kaniko_command.extend([
|
||||
'--destination', image_name
|
||||
])
|
||||
elif dry:
|
||||
kaniko_command.extend([
|
||||
'--no-push'
|
||||
])
|
||||
else:
|
||||
kaniko_command.extend([
|
||||
'--no-push'
|
||||
])
|
||||
|
||||
# Add build arguments if they exist
|
||||
for arg_name, arg_value in build_args.items():
|
||||
kaniko_command.extend(['--build-arg', f'{arg_name}={arg_value}'])
|
||||
|
||||
logging.info(f"Building {service_name} with Kaniko: {' '.join(kaniko_command)}")
|
||||
|
||||
process = subprocess.Popen(kaniko_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
||||
|
||||
# Stream output in real-time
|
||||
for line in process.stdout:
|
||||
logging.info(line.strip())
|
||||
|
||||
process.wait()
|
||||
|
||||
if process.returncode == 0:
|
||||
logging.info(f"Successfully built {service_name}")
|
||||
else:
|
||||
for line in process.stderr:
|
||||
logging.error(line.strip())
|
||||
logging.error(f"Error building {service_name}")
|
||||
raise Exception(f"Failed to build {service_name}")
|
||||
|
||||
def show_help():
|
||||
print(ASCII_ART)
|
||||
print("EpicMorg: Kaniko-Compose Wrapper\n")
|
||||
print("Arguments:")
|
||||
print("--compose-file Path to docker-compose.yml file")
|
||||
print("--kaniko-image Kaniko executor image")
|
||||
print("--push, --deploy, -d, -p Deploy the built images to the registry")
|
||||
print("--dry-run, --dry Dry run: build images without pushing and with cleanup")
|
||||
print("--version, -v Show script version")
|
||||
print("--help, -h Show this help message and exit")
|
||||
|
||||
def show_version():
|
||||
print(ASCII_ART)
|
||||
print(f"EpicMorg: Kaniko-Compose Wrapper {SCRIPT_VERSION}, Python: {sys.version}")
|
||||
|
||||
def main():
|
||||
setup_logging()
|
||||
|
||||
args = parse_args()
|
||||
|
||||
# Show help and exit if --help is provided
|
||||
if args.help:
|
||||
show_help()
|
||||
return
|
||||
|
||||
# Show version and exit if --version or no relevant arguments are provided
|
||||
if args.version or not (args.push or args.dry_run or args.compose_file != 'docker-compose.yml' or args.kaniko_image != 'gcr.io/kaniko-project/executor:latest'):
|
||||
show_version()
|
||||
return
|
||||
|
||||
compose_file = args.compose_file
|
||||
kaniko_image = args.kaniko_image
|
||||
deploy = args.push
|
||||
dry = args.dry_run
|
||||
|
||||
if not os.path.exists(compose_file):
|
||||
logging.error(f"{compose_file} not found")
|
||||
return
|
||||
|
||||
compose_data = load_compose_file(compose_file)
|
||||
|
||||
services = compose_data.get('services', {})
|
||||
image_names = defaultdict(int)
|
||||
|
||||
for service_name, service_data in services.items():
|
||||
image_name = service_data.get('image')
|
||||
|
||||
if not image_name:
|
||||
logging.warning(f"No image specified for service {service_name}")
|
||||
continue
|
||||
|
||||
image_names[image_name] += 1
|
||||
|
||||
for image_name, count in image_names.items():
|
||||
if count > 1:
|
||||
logging.error(f"Error: Image name {image_name} is used {count} times.")
|
||||
return
|
||||
|
||||
try:
|
||||
with ThreadPoolExecutor() as executor:
|
||||
futures = []
|
||||
for service_name, service_data in services.items():
|
||||
build_data = service_data.get('build', {})
|
||||
build_context = build_data.get('context', '.')
|
||||
dockerfile = build_data.get('dockerfile', 'Dockerfile')
|
||||
image_name = service_data.get('image')
|
||||
build_args = build_data.get('args', {})
|
||||
|
||||
# Substitute environment variables with their values if they exist
|
||||
build_args = {key: os.getenv(key, value) for key, value in build_args.items()}
|
||||
|
||||
if not image_name:
|
||||
logging.warning(f"No image specified for service {service_name}")
|
||||
continue
|
||||
|
||||
futures.append(executor.submit(build_with_kaniko, service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry))
|
||||
|
||||
for future in as_completed(futures):
|
||||
future.result()
|
||||
except Exception as exc:
|
||||
logging.error(f"Build failed: {exc}")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -0,0 +1,2 @@
|
||||
PyYAML
|
||||
python-dotenv
|
48
linux/ecosystem/atlassian/confluence/9/9.0.1/Dockerfile
Normal file
48
linux/ecosystem/atlassian/confluence/9/9.0.1/Dockerfile
Normal file
@ -0,0 +1,48 @@
|
||||
FROM epicmorg/debian:bookworm-jdk11
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
ARG RELEASE=9.0.1
|
||||
ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html
|
||||
ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence
|
||||
ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence
|
||||
|
||||
VOLUME ["${CONFLUENCE_HOME}"]
|
||||
WORKDIR $CONFLUENCE_HOME
|
||||
|
||||
# Expose HTTP and Synchrony ports
|
||||
EXPOSE 8090
|
||||
EXPOSE 8091
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \
|
||||
&& curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
@ -0,0 +1,49 @@
|
||||
FROM epicmorg/debian:bookworm-jdk11
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
ARG RELEASE=9.0.1
|
||||
ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html
|
||||
ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence
|
||||
ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence
|
||||
|
||||
VOLUME ["${CONFLUENCE_HOME}"]
|
||||
WORKDIR $CONFLUENCE_HOME
|
||||
|
||||
# Expose HTTP and Synchrony ports
|
||||
EXPOSE 8090
|
||||
EXPOSE 8091
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \
|
||||
&& curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \
|
||||
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
@ -0,0 +1,49 @@
|
||||
FROM epicmorg/debian:bookworm-jdk17
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
ARG RELEASE=9.0.1
|
||||
ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html
|
||||
ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence
|
||||
ENV CONFLUENCE_INSTALL_DIR /opt/atlassian/confluence
|
||||
|
||||
VOLUME ["${CONFLUENCE_HOME}"]
|
||||
WORKDIR $CONFLUENCE_HOME
|
||||
|
||||
# Expose HTTP and Synchrony ports
|
||||
EXPOSE 8090
|
||||
EXPOSE 8091
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${CONFLUENCE_INSTALL_DIR} \
|
||||
&& curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && \
|
||||
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
50
linux/ecosystem/atlassian/confluence/9/9.0.1/Makefile
Normal file
50
linux/ecosystem/atlassian/confluence/9/9.0.1/Makefile
Normal file
@ -0,0 +1,50 @@
|
||||
PIP_BREAK_SYSTEM_PACKAGES=1
|
||||
|
||||
all: app
|
||||
|
||||
app:
|
||||
make build
|
||||
make deploy
|
||||
make clean
|
||||
|
||||
build:
|
||||
make pip
|
||||
python3 kaniko-build.py --version
|
||||
|
||||
dry:
|
||||
make dry-run
|
||||
|
||||
test:
|
||||
make dry-run
|
||||
|
||||
dry-run:
|
||||
python3 kaniko-build.py --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug --dry-run
|
||||
|
||||
pip:
|
||||
rm -rf /usr/lib/python3.6/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.7/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.8/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.13/EXTERNALLY-MANAGED
|
||||
pip3 install -r requirements.txt
|
||||
pip install -r requirements.txt
|
||||
|
||||
build-compose:
|
||||
docker-compose build --compress --parallel --progress plain
|
||||
|
||||
deploy:
|
||||
make pip
|
||||
python3 kaniko-build.py --deploy --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug
|
||||
|
||||
deploy-compose:
|
||||
docker-compose push
|
||||
|
||||
clean:
|
||||
docker container prune -f
|
||||
docker image prune -f
|
||||
docker network prune -f
|
||||
docker volume prune -f
|
||||
docker system prune -af
|
@ -0,0 +1,16 @@
|
||||
#version: '3'
|
||||
services:
|
||||
app:
|
||||
image: "epicmorg/confluence:9.0.1"
|
||||
build:
|
||||
context: .
|
||||
app-jdk11:
|
||||
image: "epicmorg/confluence:9.0.1-jdk11"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.jdk11
|
||||
app-jdk17:
|
||||
image: "epicmorg/confluence:9.0.1-jdk17"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.jdk17
|
39
linux/ecosystem/atlassian/confluence/9/9.0.1/entrypoint.sh
Executable file
39
linux/ecosystem/atlassian/confluence/9/9.0.1/entrypoint.sh
Executable file
@ -0,0 +1,39 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
|
||||
export JRE_HOME="$JAVA_HOME/jre"
|
||||
export JAVA_BINARY="$JRE_HOME/bin/java"
|
||||
export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}')
|
||||
|
||||
|
||||
# Setup Catalina Opts
|
||||
: ${CATALINA_CONNECTOR_PROXYNAME:=}
|
||||
: ${CATALINA_CONNECTOR_PROXYPORT:=}
|
||||
: ${CATALINA_CONNECTOR_SCHEME:=http}
|
||||
: ${CATALINA_CONNECTOR_SECURE:=false}
|
||||
|
||||
: ${CATALINA_OPTS:=}
|
||||
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}"
|
||||
|
||||
export CATALINA_OPTS
|
||||
|
||||
|
||||
# Start Confluence as the correct user
|
||||
if [ "${UID}" -eq 0 ]; then
|
||||
echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}"
|
||||
PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${CONFLUENCE_HOME}")
|
||||
EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700
|
||||
if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then
|
||||
chmod -R 700 "${CONFLUENCE_HOME}" &&
|
||||
chown -R "${RUN_USER}:${RUN_GROUP}" "${CONFLUENCE_HOME}"
|
||||
fi
|
||||
# Now drop privileges
|
||||
exec su -s /bin/bash "${RUN_USER}" -c "$CONFLUENCE_INSTALL_DIR/bin/start-confluence.sh $@"
|
||||
else
|
||||
exec "$CONFLUENCE_INSTALL_DIR/bin/start-confluence.sh" "$@"
|
||||
fi
|
196
linux/ecosystem/atlassian/confluence/9/9.0.1/kaniko-build.py
Normal file
196
linux/ecosystem/atlassian/confluence/9/9.0.1/kaniko-build.py
Normal file
@ -0,0 +1,196 @@
|
||||
import os
|
||||
import shutil
|
||||
import argparse
|
||||
import yaml
|
||||
import subprocess
|
||||
from collections import defaultdict
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
from dotenv import load_dotenv
|
||||
import logging
|
||||
import sys
|
||||
|
||||
# Script version
|
||||
SCRIPT_VERSION = "1.0.1.0"
|
||||
|
||||
# ASCII art for EpicMorg
|
||||
ASCII_ART = r"""
|
||||
+=================================================+
|
||||
| ____| _) \ | |
|
||||
| __| __ \ | __| |\/ | _ \ __| _` | |
|
||||
| | | | | ( | | ( | | ( | |
|
||||
|_____| .__/ _| \___| _| _| \___/ _| \__, | |
|
||||
| | / _| _) | |___/ |
|
||||
| ' / _` | __ \ | | / _ \ |
|
||||
| . \ ( | | | | < ( | |
|
||||
|_|\_\ \__,_| _| _| _| _|\_\ \___/ |
|
||||
|\ \ / |
|
||||
| \ \ \ / __| _` | __ \ __ \ _ \ __||
|
||||
| \ \ \ / | ( | | | | | __/ | |
|
||||
| \_/\_/ _| \__,_| .__/ .__/ \___| _| |
|
||||
| _| _| |
|
||||
+=================================================+
|
||||
"""
|
||||
|
||||
# Load environment variables from .env file
|
||||
load_dotenv()
|
||||
|
||||
def setup_logging():
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
|
||||
def parse_args():
|
||||
parser = argparse.ArgumentParser(description="EpicMorg: Kaniko-Compose Wrapper", add_help=False)
|
||||
parser.add_argument('--compose-file', default=os.getenv('COMPOSE_FILE', 'docker-compose.yml'), help='Path to docker-compose.yml file')
|
||||
parser.add_argument('--kaniko-image', default=os.getenv('KANIKO_IMAGE', 'gcr.io/kaniko-project/executor:latest'), help='Kaniko executor image')
|
||||
parser.add_argument('--push', '--deploy', '-d', '-p', action='store_true', help='Deploy the built images to the registry')
|
||||
parser.add_argument('--dry-run', '--dry', action='store_true', help='Dry run: build images without pushing and with cleanup')
|
||||
parser.add_argument('--version', '-v', action='store_true', help='Show script version')
|
||||
parser.add_argument('--help', '-h', action='store_true', help='Show this help message and exit')
|
||||
return parser.parse_args()
|
||||
|
||||
def load_compose_file(file_path):
|
||||
with open(file_path, 'r') as file:
|
||||
return yaml.safe_load(file)
|
||||
|
||||
def build_with_kaniko(service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry):
|
||||
kaniko_command = [
|
||||
'docker', 'run',
|
||||
'--rm',
|
||||
'-t',
|
||||
'-v', f'{os.path.abspath(build_context)}:/workspace',
|
||||
]
|
||||
|
||||
# Add Docker config mounts for both read-only access
|
||||
kaniko_command.extend([
|
||||
'-v', '/var/run/docker.sock:/var/run/docker.sock:ro', # Access to Docker daemon
|
||||
'-v', f'{os.path.expanduser("~")}/.docker:/kaniko/.docker:ro', # Use existing Docker credentials in read-only mode
|
||||
])
|
||||
|
||||
kaniko_command.extend([
|
||||
kaniko_image,
|
||||
'--context', '/workspace',
|
||||
'--dockerfile', f'/workspace/{dockerfile}',
|
||||
'--compressed-caching',
|
||||
'--single-snapshot',
|
||||
'--cleanup'
|
||||
])
|
||||
|
||||
if deploy:
|
||||
kaniko_command.extend([
|
||||
'--destination', image_name
|
||||
])
|
||||
elif dry:
|
||||
kaniko_command.extend([
|
||||
'--no-push'
|
||||
])
|
||||
else:
|
||||
kaniko_command.extend([
|
||||
'--no-push'
|
||||
])
|
||||
|
||||
# Add build arguments if they exist
|
||||
for arg_name, arg_value in build_args.items():
|
||||
kaniko_command.extend(['--build-arg', f'{arg_name}={arg_value}'])
|
||||
|
||||
logging.info(f"Building {service_name} with Kaniko: {' '.join(kaniko_command)}")
|
||||
|
||||
process = subprocess.Popen(kaniko_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
||||
|
||||
# Stream output in real-time
|
||||
for line in process.stdout:
|
||||
logging.info(line.strip())
|
||||
|
||||
process.wait()
|
||||
|
||||
if process.returncode == 0:
|
||||
logging.info(f"Successfully built {service_name}")
|
||||
else:
|
||||
for line in process.stderr:
|
||||
logging.error(line.strip())
|
||||
logging.error(f"Error building {service_name}")
|
||||
raise Exception(f"Failed to build {service_name}")
|
||||
|
||||
def show_help():
|
||||
print(ASCII_ART)
|
||||
print("EpicMorg: Kaniko-Compose Wrapper\n")
|
||||
print("Arguments:")
|
||||
print("--compose-file Path to docker-compose.yml file")
|
||||
print("--kaniko-image Kaniko executor image")
|
||||
print("--push, --deploy, -d, -p Deploy the built images to the registry")
|
||||
print("--dry-run, --dry Dry run: build images without pushing and with cleanup")
|
||||
print("--version, -v Show script version")
|
||||
print("--help, -h Show this help message and exit")
|
||||
|
||||
def show_version():
|
||||
print(ASCII_ART)
|
||||
print(f"EpicMorg: Kaniko-Compose Wrapper {SCRIPT_VERSION}, Python: {sys.version}")
|
||||
|
||||
def main():
|
||||
setup_logging()
|
||||
|
||||
args = parse_args()
|
||||
|
||||
# Show help and exit if --help is provided
|
||||
if args.help:
|
||||
show_help()
|
||||
return
|
||||
|
||||
# Show version and exit if --version or no relevant arguments are provided
|
||||
if args.version or not (args.push or args.dry_run or args.compose_file != 'docker-compose.yml' or args.kaniko_image != 'gcr.io/kaniko-project/executor:latest'):
|
||||
show_version()
|
||||
return
|
||||
|
||||
compose_file = args.compose_file
|
||||
kaniko_image = args.kaniko_image
|
||||
deploy = args.push
|
||||
dry = args.dry_run
|
||||
|
||||
if not os.path.exists(compose_file):
|
||||
logging.error(f"{compose_file} not found")
|
||||
return
|
||||
|
||||
compose_data = load_compose_file(compose_file)
|
||||
|
||||
services = compose_data.get('services', {})
|
||||
image_names = defaultdict(int)
|
||||
|
||||
for service_name, service_data in services.items():
|
||||
image_name = service_data.get('image')
|
||||
|
||||
if not image_name:
|
||||
logging.warning(f"No image specified for service {service_name}")
|
||||
continue
|
||||
|
||||
image_names[image_name] += 1
|
||||
|
||||
for image_name, count in image_names.items():
|
||||
if count > 1:
|
||||
logging.error(f"Error: Image name {image_name} is used {count} times.")
|
||||
return
|
||||
|
||||
try:
|
||||
with ThreadPoolExecutor() as executor:
|
||||
futures = []
|
||||
for service_name, service_data in services.items():
|
||||
build_data = service_data.get('build', {})
|
||||
build_context = build_data.get('context', '.')
|
||||
dockerfile = build_data.get('dockerfile', 'Dockerfile')
|
||||
image_name = service_data.get('image')
|
||||
build_args = build_data.get('args', {})
|
||||
|
||||
# Substitute environment variables with their values if they exist
|
||||
build_args = {key: os.getenv(key, value) for key, value in build_args.items()}
|
||||
|
||||
if not image_name:
|
||||
logging.warning(f"No image specified for service {service_name}")
|
||||
continue
|
||||
|
||||
futures.append(executor.submit(build_with_kaniko, service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry))
|
||||
|
||||
for future in as_completed(futures):
|
||||
future.result()
|
||||
except Exception as exc:
|
||||
logging.error(f"Build failed: {exc}")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -0,0 +1,2 @@
|
||||
PyYAML
|
||||
python-dotenv
|
53
linux/ecosystem/atlassian/jira/9/9.12.12/Dockerfile
Normal file
53
linux/ecosystem/atlassian/jira/9/9.12.12/Dockerfile
Normal file
@ -0,0 +1,53 @@
|
||||
FROM epicmorg/debian:bookworm-jdk8
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
|
||||
ARG RELEASE=9.12.12
|
||||
ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files
|
||||
ENV JIRA_HOME /var/atlassian/application-data/jira
|
||||
ENV JIRA_INSTALL_DIR /opt/atlassian/jira
|
||||
|
||||
VOLUME ["${JIRA_HOME}"]
|
||||
WORKDIR $JIRA_HOME
|
||||
|
||||
# Expose HTTP port
|
||||
EXPOSE 8080
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${JIRA_INSTALL_DIR} \
|
||||
&& wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \
|
||||
&& tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \
|
||||
&& sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb && \
|
||||
rm -rfv /tmp/*
|
||||
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
52
linux/ecosystem/atlassian/jira/9/9.12.12/Dockerfile.jdk11
Normal file
52
linux/ecosystem/atlassian/jira/9/9.12.12/Dockerfile.jdk11
Normal file
@ -0,0 +1,52 @@
|
||||
FROM epicmorg/debian:bookworm-jdk11
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
|
||||
ARG RELEASE=9.12.12
|
||||
ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files
|
||||
ENV JIRA_HOME /var/atlassian/application-data/jira
|
||||
ENV JIRA_INSTALL_DIR /opt/atlassian/jira
|
||||
|
||||
VOLUME ["${JIRA_HOME}"]
|
||||
WORKDIR $JIRA_HOME
|
||||
|
||||
# Expose HTTP port
|
||||
EXPOSE 8080
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${JIRA_INSTALL_DIR} \
|
||||
&& wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \
|
||||
&& tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \
|
||||
&& sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb && \
|
||||
rm -rfv /tmp/*
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
52
linux/ecosystem/atlassian/jira/9/9.12.12/Dockerfile.jdk17
Normal file
52
linux/ecosystem/atlassian/jira/9/9.12.12/Dockerfile.jdk17
Normal file
@ -0,0 +1,52 @@
|
||||
FROM epicmorg/debian:bookworm-jdk17
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
|
||||
ARG RELEASE=9.12.12
|
||||
ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files
|
||||
ENV JIRA_HOME /var/atlassian/application-data/jira
|
||||
ENV JIRA_INSTALL_DIR /opt/atlassian/jira
|
||||
|
||||
VOLUME ["${JIRA_HOME}"]
|
||||
WORKDIR $JIRA_HOME
|
||||
|
||||
# Expose HTTP port
|
||||
EXPOSE 8080
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${JIRA_INSTALL_DIR} \
|
||||
&& wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \
|
||||
&& tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \
|
||||
&& sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb && \
|
||||
rm -rfv /tmp/*
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
50
linux/ecosystem/atlassian/jira/9/9.12.12/Makefile
Normal file
50
linux/ecosystem/atlassian/jira/9/9.12.12/Makefile
Normal file
@ -0,0 +1,50 @@
|
||||
PIP_BREAK_SYSTEM_PACKAGES=1
|
||||
|
||||
all: app
|
||||
|
||||
app:
|
||||
make build
|
||||
make deploy
|
||||
make clean
|
||||
|
||||
build:
|
||||
make pip
|
||||
python3 kaniko-build.py --version
|
||||
|
||||
dry:
|
||||
make dry-run
|
||||
|
||||
test:
|
||||
make dry-run
|
||||
|
||||
dry-run:
|
||||
python3 kaniko-build.py --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug --dry-run
|
||||
|
||||
pip:
|
||||
rm -rf /usr/lib/python3.6/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.7/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.8/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.13/EXTERNALLY-MANAGED
|
||||
pip3 install -r requirements.txt
|
||||
pip install -r requirements.txt
|
||||
|
||||
build-compose:
|
||||
docker-compose build --compress --parallel --progress plain
|
||||
|
||||
deploy:
|
||||
make pip
|
||||
python3 kaniko-build.py --deploy --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug
|
||||
|
||||
deploy-compose:
|
||||
docker-compose push
|
||||
|
||||
clean:
|
||||
docker container prune -f
|
||||
docker image prune -f
|
||||
docker network prune -f
|
||||
docker volume prune -f
|
||||
docker system prune -af
|
16
linux/ecosystem/atlassian/jira/9/9.12.12/docker-compose.yml
Normal file
16
linux/ecosystem/atlassian/jira/9/9.12.12/docker-compose.yml
Normal file
@ -0,0 +1,16 @@
|
||||
#version: '3'
|
||||
services:
|
||||
app:
|
||||
image: "epicmorg/jira:9.12.12"
|
||||
build:
|
||||
context: .
|
||||
app-jdk11:
|
||||
image: "epicmorg/jira:9.12.12-jdk11"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.jdk11
|
||||
app-jdk17:
|
||||
image: "epicmorg/jira:9.12.12-jdk17"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.jdk17
|
89
linux/ecosystem/atlassian/jira/9/9.12.12/entrypoint.sh
Executable file
89
linux/ecosystem/atlassian/jira/9/9.12.12/entrypoint.sh
Executable file
@ -0,0 +1,89 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
|
||||
export JRE_HOME="$JAVA_HOME/jre"
|
||||
export JAVA_BINARY="$JRE_HOME/bin/java"
|
||||
export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}')
|
||||
|
||||
# Setup Catalina Opts
|
||||
: ${CATALINA_CONNECTOR_PROXYNAME:=}
|
||||
: ${CATALINA_CONNECTOR_PROXYPORT:=}
|
||||
: ${CATALINA_CONNECTOR_SCHEME:=http}
|
||||
: ${CATALINA_CONNECTOR_SECURE:=false}
|
||||
|
||||
: ${CATALINA_OPTS:=}
|
||||
|
||||
: ${JAVA_OPTS:=}
|
||||
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}"
|
||||
|
||||
export JAVA_OPTS="${JAVA_OPTS} ${CATALINA_OPTS}"
|
||||
|
||||
# Setup Data Center configuration
|
||||
if [ ! -f "/etc/container_id" ]; then
|
||||
uuidgen > /etc/container_id
|
||||
fi
|
||||
CONTAINER_ID=$(cat /etc/container_id)
|
||||
CONTAINER_SHORT_ID=${CONTAINER_ID::8}
|
||||
|
||||
: ${CLUSTERED:=false}
|
||||
: ${JIRA_NODE_ID:=jira_node_${CONTAINER_SHORT_ID}}
|
||||
: ${JIRA_SHARED_HOME:=${JIRA_HOME}/shared}
|
||||
: ${EHCACHE_PEER_DISCOVERY:=}
|
||||
: ${EHCACHE_LISTENER_HOSTNAME:=}
|
||||
: ${EHCACHE_LISTENER_PORT:=}
|
||||
: ${EHCACHE_LISTENER_SOCKETTIMEOUTMILLIS:=}
|
||||
: ${EHCACHE_MULTICAST_ADDRESS:=}
|
||||
: ${EHCACHE_MULTICAST_PORT:=}
|
||||
: ${EHCACHE_MULTICAST_TIMETOLIVE:=}
|
||||
: ${EHCACHE_MULTICAST_HOSTNAME:=}
|
||||
|
||||
# Cleanly set/unset values in cluster.properties
|
||||
function set_cluster_property {
|
||||
if [ -z $2 ]; then
|
||||
if [ -f "${JIRA_HOME}/cluster.properties" ]; then
|
||||
sed -i -e "/^${1}/d" "${JIRA_HOME}/cluster.properties"
|
||||
fi
|
||||
return
|
||||
fi
|
||||
if [ ! -f "${JIRA_HOME}/cluster.properties" ]; then
|
||||
echo "${1}=${2}" >> "${JIRA_HOME}/cluster.properties"
|
||||
elif grep "^${1}" "${JIRA_HOME}/cluster.properties"; then
|
||||
sed -i -e "s#^${1}=.*#${1}=${2}#g" "${JIRA_HOME}/cluster.properties"
|
||||
else
|
||||
echo "${1}=${2}" >> "${JIRA_HOME}/cluster.properties"
|
||||
fi
|
||||
}
|
||||
|
||||
if [ "${CLUSTERED}" == "true" ]; then
|
||||
set_cluster_property "jira.node.id" "${JIRA_NODE_ID}"
|
||||
set_cluster_property "jira.shared.home" "${JIRA_SHARED_HOME}"
|
||||
set_cluster_property "ehcache.peer.discovery" "${EHCACHE_PEER_DISCOVERY}"
|
||||
set_cluster_property "ehcache.listener.hostName" "${EHCACHE_LISTENER_HOSTNAME}"
|
||||
set_cluster_property "ehcache.listener.port" "${EHCACHE_LISTENER_PORT}"
|
||||
set_cluster_property "ehcache.listener.socketTimeoutMillis" "${EHCACHE_LISTENER_PORT}"
|
||||
set_cluster_property "ehcache.multicast.address" "${EHCACHE_MULTICAST_ADDRESS}"
|
||||
set_cluster_property "ehcache.multicast.port" "${EHCACHE_MULTICAST_PORT}"
|
||||
set_cluster_property "ehcache.multicast.timeToLive" "${EHCACHE_MULTICAST_TIMETOLIVE}"
|
||||
set_cluster_property "ehcache.multicast.hostName" "${EHCACHE_MULTICAST_HOSTNAME}"
|
||||
fi
|
||||
|
||||
|
||||
# Start Jira as the correct user
|
||||
if [ "${UID}" -eq 0 ]; then
|
||||
echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}"
|
||||
PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${JIRA_HOME}")
|
||||
EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700
|
||||
if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then
|
||||
chmod -R 700 "${JIRA_HOME}" &&
|
||||
chown -R "${RUN_USER}:${RUN_GROUP}" "${JIRA_HOME}"
|
||||
fi
|
||||
# Now drop privileges
|
||||
exec su -s /bin/bash "${RUN_USER}" -c "$JIRA_INSTALL_DIR/bin/start-jira.sh $@"
|
||||
else
|
||||
exec "$JIRA_INSTALL_DIR/bin/start-jira.sh" "$@"
|
||||
fi
|
196
linux/ecosystem/atlassian/jira/9/9.12.12/kaniko-build.py
Normal file
196
linux/ecosystem/atlassian/jira/9/9.12.12/kaniko-build.py
Normal file
@ -0,0 +1,196 @@
|
||||
import os
|
||||
import shutil
|
||||
import argparse
|
||||
import yaml
|
||||
import subprocess
|
||||
from collections import defaultdict
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
from dotenv import load_dotenv
|
||||
import logging
|
||||
import sys
|
||||
|
||||
# Script version
|
||||
SCRIPT_VERSION = "1.0.1.0"
|
||||
|
||||
# ASCII art for EpicMorg
|
||||
ASCII_ART = r"""
|
||||
+=================================================+
|
||||
| ____| _) \ | |
|
||||
| __| __ \ | __| |\/ | _ \ __| _` | |
|
||||
| | | | | ( | | ( | | ( | |
|
||||
|_____| .__/ _| \___| _| _| \___/ _| \__, | |
|
||||
| | / _| _) | |___/ |
|
||||
| ' / _` | __ \ | | / _ \ |
|
||||
| . \ ( | | | | < ( | |
|
||||
|_|\_\ \__,_| _| _| _| _|\_\ \___/ |
|
||||
|\ \ / |
|
||||
| \ \ \ / __| _` | __ \ __ \ _ \ __||
|
||||
| \ \ \ / | ( | | | | | __/ | |
|
||||
| \_/\_/ _| \__,_| .__/ .__/ \___| _| |
|
||||
| _| _| |
|
||||
+=================================================+
|
||||
"""
|
||||
|
||||
# Load environment variables from .env file
|
||||
load_dotenv()
|
||||
|
||||
def setup_logging():
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
|
||||
def parse_args():
|
||||
parser = argparse.ArgumentParser(description="EpicMorg: Kaniko-Compose Wrapper", add_help=False)
|
||||
parser.add_argument('--compose-file', default=os.getenv('COMPOSE_FILE', 'docker-compose.yml'), help='Path to docker-compose.yml file')
|
||||
parser.add_argument('--kaniko-image', default=os.getenv('KANIKO_IMAGE', 'gcr.io/kaniko-project/executor:latest'), help='Kaniko executor image')
|
||||
parser.add_argument('--push', '--deploy', '-d', '-p', action='store_true', help='Deploy the built images to the registry')
|
||||
parser.add_argument('--dry-run', '--dry', action='store_true', help='Dry run: build images without pushing and with cleanup')
|
||||
parser.add_argument('--version', '-v', action='store_true', help='Show script version')
|
||||
parser.add_argument('--help', '-h', action='store_true', help='Show this help message and exit')
|
||||
return parser.parse_args()
|
||||
|
||||
def load_compose_file(file_path):
|
||||
with open(file_path, 'r') as file:
|
||||
return yaml.safe_load(file)
|
||||
|
||||
def build_with_kaniko(service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry):
|
||||
kaniko_command = [
|
||||
'docker', 'run',
|
||||
'--rm',
|
||||
'-t',
|
||||
'-v', f'{os.path.abspath(build_context)}:/workspace',
|
||||
]
|
||||
|
||||
# Add Docker config mounts for both read-only access
|
||||
kaniko_command.extend([
|
||||
'-v', '/var/run/docker.sock:/var/run/docker.sock:ro', # Access to Docker daemon
|
||||
'-v', f'{os.path.expanduser("~")}/.docker:/kaniko/.docker:ro', # Use existing Docker credentials in read-only mode
|
||||
])
|
||||
|
||||
kaniko_command.extend([
|
||||
kaniko_image,
|
||||
'--context', '/workspace',
|
||||
'--dockerfile', f'/workspace/{dockerfile}',
|
||||
'--compressed-caching',
|
||||
'--single-snapshot',
|
||||
'--cleanup'
|
||||
])
|
||||
|
||||
if deploy:
|
||||
kaniko_command.extend([
|
||||
'--destination', image_name
|
||||
])
|
||||
elif dry:
|
||||
kaniko_command.extend([
|
||||
'--no-push'
|
||||
])
|
||||
else:
|
||||
kaniko_command.extend([
|
||||
'--no-push'
|
||||
])
|
||||
|
||||
# Add build arguments if they exist
|
||||
for arg_name, arg_value in build_args.items():
|
||||
kaniko_command.extend(['--build-arg', f'{arg_name}={arg_value}'])
|
||||
|
||||
logging.info(f"Building {service_name} with Kaniko: {' '.join(kaniko_command)}")
|
||||
|
||||
process = subprocess.Popen(kaniko_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
||||
|
||||
# Stream output in real-time
|
||||
for line in process.stdout:
|
||||
logging.info(line.strip())
|
||||
|
||||
process.wait()
|
||||
|
||||
if process.returncode == 0:
|
||||
logging.info(f"Successfully built {service_name}")
|
||||
else:
|
||||
for line in process.stderr:
|
||||
logging.error(line.strip())
|
||||
logging.error(f"Error building {service_name}")
|
||||
raise Exception(f"Failed to build {service_name}")
|
||||
|
||||
def show_help():
|
||||
print(ASCII_ART)
|
||||
print("EpicMorg: Kaniko-Compose Wrapper\n")
|
||||
print("Arguments:")
|
||||
print("--compose-file Path to docker-compose.yml file")
|
||||
print("--kaniko-image Kaniko executor image")
|
||||
print("--push, --deploy, -d, -p Deploy the built images to the registry")
|
||||
print("--dry-run, --dry Dry run: build images without pushing and with cleanup")
|
||||
print("--version, -v Show script version")
|
||||
print("--help, -h Show this help message and exit")
|
||||
|
||||
def show_version():
|
||||
print(ASCII_ART)
|
||||
print(f"EpicMorg: Kaniko-Compose Wrapper {SCRIPT_VERSION}, Python: {sys.version}")
|
||||
|
||||
def main():
|
||||
setup_logging()
|
||||
|
||||
args = parse_args()
|
||||
|
||||
# Show help and exit if --help is provided
|
||||
if args.help:
|
||||
show_help()
|
||||
return
|
||||
|
||||
# Show version and exit if --version or no relevant arguments are provided
|
||||
if args.version or not (args.push or args.dry_run or args.compose_file != 'docker-compose.yml' or args.kaniko_image != 'gcr.io/kaniko-project/executor:latest'):
|
||||
show_version()
|
||||
return
|
||||
|
||||
compose_file = args.compose_file
|
||||
kaniko_image = args.kaniko_image
|
||||
deploy = args.push
|
||||
dry = args.dry_run
|
||||
|
||||
if not os.path.exists(compose_file):
|
||||
logging.error(f"{compose_file} not found")
|
||||
return
|
||||
|
||||
compose_data = load_compose_file(compose_file)
|
||||
|
||||
services = compose_data.get('services', {})
|
||||
image_names = defaultdict(int)
|
||||
|
||||
for service_name, service_data in services.items():
|
||||
image_name = service_data.get('image')
|
||||
|
||||
if not image_name:
|
||||
logging.warning(f"No image specified for service {service_name}")
|
||||
continue
|
||||
|
||||
image_names[image_name] += 1
|
||||
|
||||
for image_name, count in image_names.items():
|
||||
if count > 1:
|
||||
logging.error(f"Error: Image name {image_name} is used {count} times.")
|
||||
return
|
||||
|
||||
try:
|
||||
with ThreadPoolExecutor() as executor:
|
||||
futures = []
|
||||
for service_name, service_data in services.items():
|
||||
build_data = service_data.get('build', {})
|
||||
build_context = build_data.get('context', '.')
|
||||
dockerfile = build_data.get('dockerfile', 'Dockerfile')
|
||||
image_name = service_data.get('image')
|
||||
build_args = build_data.get('args', {})
|
||||
|
||||
# Substitute environment variables with their values if they exist
|
||||
build_args = {key: os.getenv(key, value) for key, value in build_args.items()}
|
||||
|
||||
if not image_name:
|
||||
logging.warning(f"No image specified for service {service_name}")
|
||||
continue
|
||||
|
||||
futures.append(executor.submit(build_with_kaniko, service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry))
|
||||
|
||||
for future in as_completed(futures):
|
||||
future.result()
|
||||
except Exception as exc:
|
||||
logging.error(f"Build failed: {exc}")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -0,0 +1,2 @@
|
||||
PyYAML
|
||||
python-dotenv
|
@ -1,2 +0,0 @@
|
||||
RELEASE=9.12.2
|
||||
DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz
|
@ -6,8 +6,8 @@ ARG DEBIAN_FRONTEND=noninteractive
|
||||
# ARGuments
|
||||
##################################################################
|
||||
|
||||
ARG RELEASE
|
||||
ARG DOWNLOAD_URL
|
||||
ARG RELEASE=9.12.2
|
||||
ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
@ -29,7 +29,8 @@ EXPOSE 8080
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${JIRA_INSTALL_DIR} \
|
||||
&& curl --user-agent "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/81.0" -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$JIRA_INSTALL_DIR" \
|
||||
&& wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \
|
||||
&& tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
|
@ -6,8 +6,8 @@ ARG DEBIAN_FRONTEND=noninteractive
|
||||
# ARGuments
|
||||
##################################################################
|
||||
|
||||
ARG RELEASE
|
||||
ARG DOWNLOAD_URL
|
||||
ARG RELEASE=9.12.2
|
||||
ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
@ -29,7 +29,8 @@ EXPOSE 8080
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${JIRA_INSTALL_DIR} \
|
||||
&& curl --user-agent "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/81.0" -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$JIRA_INSTALL_DIR" \
|
||||
&& wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \
|
||||
&& tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
|
@ -6,8 +6,8 @@ ARG DEBIAN_FRONTEND=noninteractive
|
||||
# ARGuments
|
||||
##################################################################
|
||||
|
||||
ARG RELEASE
|
||||
ARG DOWNLOAD_URL
|
||||
ARG RELEASE=9.12.2
|
||||
ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
@ -29,7 +29,8 @@ EXPOSE 8080
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${JIRA_INSTALL_DIR} \
|
||||
&& curl --user-agent "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/81.0" -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$JIRA_INSTALL_DIR" \
|
||||
&& wget --random-wait --retry-connrefused --waitretry=5 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \
|
||||
&& tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
|
@ -1,25 +1,16 @@
|
||||
#version: '3'
|
||||
services:
|
||||
app:
|
||||
image: "epicmorg/jira:${RELEASE}"
|
||||
image: "epicmorg/jira:9.12.2"
|
||||
build:
|
||||
context: .
|
||||
args:
|
||||
RELEASE: ${RELEASE}
|
||||
DOWNLOAD_URL: ${DOWNLOAD_URL}
|
||||
app-jdk11:
|
||||
image: "epicmorg/jira:${RELEASE}-jdk11"
|
||||
image: "epicmorg/jira:9.12.2-jdk11"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.jdk11
|
||||
args:
|
||||
RELEASE: ${RELEASE}
|
||||
DOWNLOAD_URL: ${DOWNLOAD_URL}
|
||||
app-jdk17:
|
||||
image: "epicmorg/jira:${RELEASE}-jdk17"
|
||||
image: "epicmorg/jira:9.12.2-jdk17"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.jdk17
|
||||
args:
|
||||
RELEASE: ${RELEASE}
|
||||
DOWNLOAD_URL: ${DOWNLOAD_URL}
|
||||
|
53
linux/ecosystem/atlassian/jira/9/9.14.1/Dockerfile
Normal file
53
linux/ecosystem/atlassian/jira/9/9.14.1/Dockerfile
Normal file
@ -0,0 +1,53 @@
|
||||
FROM epicmorg/debian:bookworm-jdk8
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
|
||||
ARG RELEASE=9.14.1
|
||||
ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files
|
||||
ENV JIRA_HOME /var/atlassian/application-data/jira
|
||||
ENV JIRA_INSTALL_DIR /opt/atlassian/jira
|
||||
|
||||
VOLUME ["${JIRA_HOME}"]
|
||||
WORKDIR $JIRA_HOME
|
||||
|
||||
# Expose HTTP port
|
||||
EXPOSE 8080
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${JIRA_INSTALL_DIR} \
|
||||
&& wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \
|
||||
&& tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \
|
||||
&& sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb && \
|
||||
rm -rfv /tmp/*
|
||||
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
52
linux/ecosystem/atlassian/jira/9/9.14.1/Dockerfile.jdk11
Normal file
52
linux/ecosystem/atlassian/jira/9/9.14.1/Dockerfile.jdk11
Normal file
@ -0,0 +1,52 @@
|
||||
FROM epicmorg/debian:bookworm-jdk11
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
|
||||
ARG RELEASE=9.14.1
|
||||
ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files
|
||||
ENV JIRA_HOME /var/atlassian/application-data/jira
|
||||
ENV JIRA_INSTALL_DIR /opt/atlassian/jira
|
||||
|
||||
VOLUME ["${JIRA_HOME}"]
|
||||
WORKDIR $JIRA_HOME
|
||||
|
||||
# Expose HTTP port
|
||||
EXPOSE 8080
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${JIRA_INSTALL_DIR} \
|
||||
&& wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \
|
||||
&& tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \
|
||||
&& sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb && \
|
||||
rm -rfv /tmp/*
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
52
linux/ecosystem/atlassian/jira/9/9.14.1/Dockerfile.jdk17
Normal file
52
linux/ecosystem/atlassian/jira/9/9.14.1/Dockerfile.jdk17
Normal file
@ -0,0 +1,52 @@
|
||||
FROM epicmorg/debian:bookworm-jdk17
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
|
||||
ARG RELEASE=9.14.1
|
||||
ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files
|
||||
ENV JIRA_HOME /var/atlassian/application-data/jira
|
||||
ENV JIRA_INSTALL_DIR /opt/atlassian/jira
|
||||
|
||||
VOLUME ["${JIRA_HOME}"]
|
||||
WORKDIR $JIRA_HOME
|
||||
|
||||
# Expose HTTP port
|
||||
EXPOSE 8080
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${JIRA_INSTALL_DIR} \
|
||||
&& wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \
|
||||
&& tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \
|
||||
&& sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb && \
|
||||
rm -rfv /tmp/*
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
50
linux/ecosystem/atlassian/jira/9/9.14.1/Makefile
Normal file
50
linux/ecosystem/atlassian/jira/9/9.14.1/Makefile
Normal file
@ -0,0 +1,50 @@
|
||||
PIP_BREAK_SYSTEM_PACKAGES=1
|
||||
|
||||
all: app
|
||||
|
||||
app:
|
||||
make build
|
||||
make deploy
|
||||
make clean
|
||||
|
||||
build:
|
||||
make pip
|
||||
python3 kaniko-build.py --version
|
||||
|
||||
dry:
|
||||
make dry-run
|
||||
|
||||
test:
|
||||
make dry-run
|
||||
|
||||
dry-run:
|
||||
python3 kaniko-build.py --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug --dry-run
|
||||
|
||||
pip:
|
||||
rm -rf /usr/lib/python3.6/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.7/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.8/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.13/EXTERNALLY-MANAGED
|
||||
pip3 install -r requirements.txt
|
||||
pip install -r requirements.txt
|
||||
|
||||
build-compose:
|
||||
docker-compose build --compress --parallel --progress plain
|
||||
|
||||
deploy:
|
||||
make pip
|
||||
python3 kaniko-build.py --deploy --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug
|
||||
|
||||
deploy-compose:
|
||||
docker-compose push
|
||||
|
||||
clean:
|
||||
docker container prune -f
|
||||
docker image prune -f
|
||||
docker network prune -f
|
||||
docker volume prune -f
|
||||
docker system prune -af
|
16
linux/ecosystem/atlassian/jira/9/9.14.1/docker-compose.yml
Normal file
16
linux/ecosystem/atlassian/jira/9/9.14.1/docker-compose.yml
Normal file
@ -0,0 +1,16 @@
|
||||
#version: '3'
|
||||
services:
|
||||
app:
|
||||
image: "epicmorg/jira:9.14.1"
|
||||
build:
|
||||
context: .
|
||||
app-jdk11:
|
||||
image: "epicmorg/jira:9.14.1-jdk11"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.jdk11
|
||||
app-jdk17:
|
||||
image: "epicmorg/jira:9.14.1-jdk17"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.jdk17
|
89
linux/ecosystem/atlassian/jira/9/9.14.1/entrypoint.sh
Executable file
89
linux/ecosystem/atlassian/jira/9/9.14.1/entrypoint.sh
Executable file
@ -0,0 +1,89 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
|
||||
export JRE_HOME="$JAVA_HOME/jre"
|
||||
export JAVA_BINARY="$JRE_HOME/bin/java"
|
||||
export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}')
|
||||
|
||||
# Setup Catalina Opts
|
||||
: ${CATALINA_CONNECTOR_PROXYNAME:=}
|
||||
: ${CATALINA_CONNECTOR_PROXYPORT:=}
|
||||
: ${CATALINA_CONNECTOR_SCHEME:=http}
|
||||
: ${CATALINA_CONNECTOR_SECURE:=false}
|
||||
|
||||
: ${CATALINA_OPTS:=}
|
||||
|
||||
: ${JAVA_OPTS:=}
|
||||
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}"
|
||||
|
||||
export JAVA_OPTS="${JAVA_OPTS} ${CATALINA_OPTS}"
|
||||
|
||||
# Setup Data Center configuration
|
||||
if [ ! -f "/etc/container_id" ]; then
|
||||
uuidgen > /etc/container_id
|
||||
fi
|
||||
CONTAINER_ID=$(cat /etc/container_id)
|
||||
CONTAINER_SHORT_ID=${CONTAINER_ID::8}
|
||||
|
||||
: ${CLUSTERED:=false}
|
||||
: ${JIRA_NODE_ID:=jira_node_${CONTAINER_SHORT_ID}}
|
||||
: ${JIRA_SHARED_HOME:=${JIRA_HOME}/shared}
|
||||
: ${EHCACHE_PEER_DISCOVERY:=}
|
||||
: ${EHCACHE_LISTENER_HOSTNAME:=}
|
||||
: ${EHCACHE_LISTENER_PORT:=}
|
||||
: ${EHCACHE_LISTENER_SOCKETTIMEOUTMILLIS:=}
|
||||
: ${EHCACHE_MULTICAST_ADDRESS:=}
|
||||
: ${EHCACHE_MULTICAST_PORT:=}
|
||||
: ${EHCACHE_MULTICAST_TIMETOLIVE:=}
|
||||
: ${EHCACHE_MULTICAST_HOSTNAME:=}
|
||||
|
||||
# Cleanly set/unset values in cluster.properties
|
||||
function set_cluster_property {
|
||||
if [ -z $2 ]; then
|
||||
if [ -f "${JIRA_HOME}/cluster.properties" ]; then
|
||||
sed -i -e "/^${1}/d" "${JIRA_HOME}/cluster.properties"
|
||||
fi
|
||||
return
|
||||
fi
|
||||
if [ ! -f "${JIRA_HOME}/cluster.properties" ]; then
|
||||
echo "${1}=${2}" >> "${JIRA_HOME}/cluster.properties"
|
||||
elif grep "^${1}" "${JIRA_HOME}/cluster.properties"; then
|
||||
sed -i -e "s#^${1}=.*#${1}=${2}#g" "${JIRA_HOME}/cluster.properties"
|
||||
else
|
||||
echo "${1}=${2}" >> "${JIRA_HOME}/cluster.properties"
|
||||
fi
|
||||
}
|
||||
|
||||
if [ "${CLUSTERED}" == "true" ]; then
|
||||
set_cluster_property "jira.node.id" "${JIRA_NODE_ID}"
|
||||
set_cluster_property "jira.shared.home" "${JIRA_SHARED_HOME}"
|
||||
set_cluster_property "ehcache.peer.discovery" "${EHCACHE_PEER_DISCOVERY}"
|
||||
set_cluster_property "ehcache.listener.hostName" "${EHCACHE_LISTENER_HOSTNAME}"
|
||||
set_cluster_property "ehcache.listener.port" "${EHCACHE_LISTENER_PORT}"
|
||||
set_cluster_property "ehcache.listener.socketTimeoutMillis" "${EHCACHE_LISTENER_PORT}"
|
||||
set_cluster_property "ehcache.multicast.address" "${EHCACHE_MULTICAST_ADDRESS}"
|
||||
set_cluster_property "ehcache.multicast.port" "${EHCACHE_MULTICAST_PORT}"
|
||||
set_cluster_property "ehcache.multicast.timeToLive" "${EHCACHE_MULTICAST_TIMETOLIVE}"
|
||||
set_cluster_property "ehcache.multicast.hostName" "${EHCACHE_MULTICAST_HOSTNAME}"
|
||||
fi
|
||||
|
||||
|
||||
# Start Jira as the correct user
|
||||
if [ "${UID}" -eq 0 ]; then
|
||||
echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}"
|
||||
PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${JIRA_HOME}")
|
||||
EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700
|
||||
if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then
|
||||
chmod -R 700 "${JIRA_HOME}" &&
|
||||
chown -R "${RUN_USER}:${RUN_GROUP}" "${JIRA_HOME}"
|
||||
fi
|
||||
# Now drop privileges
|
||||
exec su -s /bin/bash "${RUN_USER}" -c "$JIRA_INSTALL_DIR/bin/start-jira.sh $@"
|
||||
else
|
||||
exec "$JIRA_INSTALL_DIR/bin/start-jira.sh" "$@"
|
||||
fi
|
196
linux/ecosystem/atlassian/jira/9/9.14.1/kaniko-build.py
Normal file
196
linux/ecosystem/atlassian/jira/9/9.14.1/kaniko-build.py
Normal file
@ -0,0 +1,196 @@
|
||||
import os
|
||||
import shutil
|
||||
import argparse
|
||||
import yaml
|
||||
import subprocess
|
||||
from collections import defaultdict
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
from dotenv import load_dotenv
|
||||
import logging
|
||||
import sys
|
||||
|
||||
# Script version
|
||||
SCRIPT_VERSION = "1.0.1.0"
|
||||
|
||||
# ASCII art for EpicMorg
|
||||
ASCII_ART = r"""
|
||||
+=================================================+
|
||||
| ____| _) \ | |
|
||||
| __| __ \ | __| |\/ | _ \ __| _` | |
|
||||
| | | | | ( | | ( | | ( | |
|
||||
|_____| .__/ _| \___| _| _| \___/ _| \__, | |
|
||||
| | / _| _) | |___/ |
|
||||
| ' / _` | __ \ | | / _ \ |
|
||||
| . \ ( | | | | < ( | |
|
||||
|_|\_\ \__,_| _| _| _| _|\_\ \___/ |
|
||||
|\ \ / |
|
||||
| \ \ \ / __| _` | __ \ __ \ _ \ __||
|
||||
| \ \ \ / | ( | | | | | __/ | |
|
||||
| \_/\_/ _| \__,_| .__/ .__/ \___| _| |
|
||||
| _| _| |
|
||||
+=================================================+
|
||||
"""
|
||||
|
||||
# Load environment variables from .env file
|
||||
load_dotenv()
|
||||
|
||||
def setup_logging():
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
|
||||
def parse_args():
|
||||
parser = argparse.ArgumentParser(description="EpicMorg: Kaniko-Compose Wrapper", add_help=False)
|
||||
parser.add_argument('--compose-file', default=os.getenv('COMPOSE_FILE', 'docker-compose.yml'), help='Path to docker-compose.yml file')
|
||||
parser.add_argument('--kaniko-image', default=os.getenv('KANIKO_IMAGE', 'gcr.io/kaniko-project/executor:latest'), help='Kaniko executor image')
|
||||
parser.add_argument('--push', '--deploy', '-d', '-p', action='store_true', help='Deploy the built images to the registry')
|
||||
parser.add_argument('--dry-run', '--dry', action='store_true', help='Dry run: build images without pushing and with cleanup')
|
||||
parser.add_argument('--version', '-v', action='store_true', help='Show script version')
|
||||
parser.add_argument('--help', '-h', action='store_true', help='Show this help message and exit')
|
||||
return parser.parse_args()
|
||||
|
||||
def load_compose_file(file_path):
|
||||
with open(file_path, 'r') as file:
|
||||
return yaml.safe_load(file)
|
||||
|
||||
def build_with_kaniko(service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry):
|
||||
kaniko_command = [
|
||||
'docker', 'run',
|
||||
'--rm',
|
||||
'-t',
|
||||
'-v', f'{os.path.abspath(build_context)}:/workspace',
|
||||
]
|
||||
|
||||
# Add Docker config mounts for both read-only access
|
||||
kaniko_command.extend([
|
||||
'-v', '/var/run/docker.sock:/var/run/docker.sock:ro', # Access to Docker daemon
|
||||
'-v', f'{os.path.expanduser("~")}/.docker:/kaniko/.docker:ro', # Use existing Docker credentials in read-only mode
|
||||
])
|
||||
|
||||
kaniko_command.extend([
|
||||
kaniko_image,
|
||||
'--context', '/workspace',
|
||||
'--dockerfile', f'/workspace/{dockerfile}',
|
||||
'--compressed-caching',
|
||||
'--single-snapshot',
|
||||
'--cleanup'
|
||||
])
|
||||
|
||||
if deploy:
|
||||
kaniko_command.extend([
|
||||
'--destination', image_name
|
||||
])
|
||||
elif dry:
|
||||
kaniko_command.extend([
|
||||
'--no-push'
|
||||
])
|
||||
else:
|
||||
kaniko_command.extend([
|
||||
'--no-push'
|
||||
])
|
||||
|
||||
# Add build arguments if they exist
|
||||
for arg_name, arg_value in build_args.items():
|
||||
kaniko_command.extend(['--build-arg', f'{arg_name}={arg_value}'])
|
||||
|
||||
logging.info(f"Building {service_name} with Kaniko: {' '.join(kaniko_command)}")
|
||||
|
||||
process = subprocess.Popen(kaniko_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
||||
|
||||
# Stream output in real-time
|
||||
for line in process.stdout:
|
||||
logging.info(line.strip())
|
||||
|
||||
process.wait()
|
||||
|
||||
if process.returncode == 0:
|
||||
logging.info(f"Successfully built {service_name}")
|
||||
else:
|
||||
for line in process.stderr:
|
||||
logging.error(line.strip())
|
||||
logging.error(f"Error building {service_name}")
|
||||
raise Exception(f"Failed to build {service_name}")
|
||||
|
||||
def show_help():
|
||||
print(ASCII_ART)
|
||||
print("EpicMorg: Kaniko-Compose Wrapper\n")
|
||||
print("Arguments:")
|
||||
print("--compose-file Path to docker-compose.yml file")
|
||||
print("--kaniko-image Kaniko executor image")
|
||||
print("--push, --deploy, -d, -p Deploy the built images to the registry")
|
||||
print("--dry-run, --dry Dry run: build images without pushing and with cleanup")
|
||||
print("--version, -v Show script version")
|
||||
print("--help, -h Show this help message and exit")
|
||||
|
||||
def show_version():
|
||||
print(ASCII_ART)
|
||||
print(f"EpicMorg: Kaniko-Compose Wrapper {SCRIPT_VERSION}, Python: {sys.version}")
|
||||
|
||||
def main():
|
||||
setup_logging()
|
||||
|
||||
args = parse_args()
|
||||
|
||||
# Show help and exit if --help is provided
|
||||
if args.help:
|
||||
show_help()
|
||||
return
|
||||
|
||||
# Show version and exit if --version or no relevant arguments are provided
|
||||
if args.version or not (args.push or args.dry_run or args.compose_file != 'docker-compose.yml' or args.kaniko_image != 'gcr.io/kaniko-project/executor:latest'):
|
||||
show_version()
|
||||
return
|
||||
|
||||
compose_file = args.compose_file
|
||||
kaniko_image = args.kaniko_image
|
||||
deploy = args.push
|
||||
dry = args.dry_run
|
||||
|
||||
if not os.path.exists(compose_file):
|
||||
logging.error(f"{compose_file} not found")
|
||||
return
|
||||
|
||||
compose_data = load_compose_file(compose_file)
|
||||
|
||||
services = compose_data.get('services', {})
|
||||
image_names = defaultdict(int)
|
||||
|
||||
for service_name, service_data in services.items():
|
||||
image_name = service_data.get('image')
|
||||
|
||||
if not image_name:
|
||||
logging.warning(f"No image specified for service {service_name}")
|
||||
continue
|
||||
|
||||
image_names[image_name] += 1
|
||||
|
||||
for image_name, count in image_names.items():
|
||||
if count > 1:
|
||||
logging.error(f"Error: Image name {image_name} is used {count} times.")
|
||||
return
|
||||
|
||||
try:
|
||||
with ThreadPoolExecutor() as executor:
|
||||
futures = []
|
||||
for service_name, service_data in services.items():
|
||||
build_data = service_data.get('build', {})
|
||||
build_context = build_data.get('context', '.')
|
||||
dockerfile = build_data.get('dockerfile', 'Dockerfile')
|
||||
image_name = service_data.get('image')
|
||||
build_args = build_data.get('args', {})
|
||||
|
||||
# Substitute environment variables with their values if they exist
|
||||
build_args = {key: os.getenv(key, value) for key, value in build_args.items()}
|
||||
|
||||
if not image_name:
|
||||
logging.warning(f"No image specified for service {service_name}")
|
||||
continue
|
||||
|
||||
futures.append(executor.submit(build_with_kaniko, service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry))
|
||||
|
||||
for future in as_completed(futures):
|
||||
future.result()
|
||||
except Exception as exc:
|
||||
logging.error(f"Build failed: {exc}")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
2
linux/ecosystem/atlassian/jira/9/9.14.1/requirements.txt
Normal file
2
linux/ecosystem/atlassian/jira/9/9.14.1/requirements.txt
Normal file
@ -0,0 +1,2 @@
|
||||
PyYAML
|
||||
python-dotenv
|
53
linux/ecosystem/atlassian/jira/9/9.16.1/Dockerfile
Normal file
53
linux/ecosystem/atlassian/jira/9/9.16.1/Dockerfile
Normal file
@ -0,0 +1,53 @@
|
||||
FROM epicmorg/debian:bookworm-jdk8
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
|
||||
ARG RELEASE=9.16.1
|
||||
ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files
|
||||
ENV JIRA_HOME /var/atlassian/application-data/jira
|
||||
ENV JIRA_INSTALL_DIR /opt/atlassian/jira
|
||||
|
||||
VOLUME ["${JIRA_HOME}"]
|
||||
WORKDIR $JIRA_HOME
|
||||
|
||||
# Expose HTTP port
|
||||
EXPOSE 8080
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${JIRA_INSTALL_DIR} \
|
||||
&& wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \
|
||||
&& tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \
|
||||
&& sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb && \
|
||||
rm -rfv /tmp/*
|
||||
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
52
linux/ecosystem/atlassian/jira/9/9.16.1/Dockerfile.jdk11
Normal file
52
linux/ecosystem/atlassian/jira/9/9.16.1/Dockerfile.jdk11
Normal file
@ -0,0 +1,52 @@
|
||||
FROM epicmorg/debian:bookworm-jdk11
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
|
||||
ARG RELEASE=9.16.1
|
||||
ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files
|
||||
ENV JIRA_HOME /var/atlassian/application-data/jira
|
||||
ENV JIRA_INSTALL_DIR /opt/atlassian/jira
|
||||
|
||||
VOLUME ["${JIRA_HOME}"]
|
||||
WORKDIR $JIRA_HOME
|
||||
|
||||
# Expose HTTP port
|
||||
EXPOSE 8080
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${JIRA_INSTALL_DIR} \
|
||||
&& wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \
|
||||
&& tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \
|
||||
&& sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb && \
|
||||
rm -rfv /tmp/*
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
52
linux/ecosystem/atlassian/jira/9/9.16.1/Dockerfile.jdk17
Normal file
52
linux/ecosystem/atlassian/jira/9/9.16.1/Dockerfile.jdk17
Normal file
@ -0,0 +1,52 @@
|
||||
FROM epicmorg/debian:bookworm-jdk17
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
|
||||
ARG RELEASE=9.16.1
|
||||
ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files
|
||||
ENV JIRA_HOME /var/atlassian/application-data/jira
|
||||
ENV JIRA_INSTALL_DIR /opt/atlassian/jira
|
||||
|
||||
VOLUME ["${JIRA_HOME}"]
|
||||
WORKDIR $JIRA_HOME
|
||||
|
||||
# Expose HTTP port
|
||||
EXPOSE 8080
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${JIRA_INSTALL_DIR} \
|
||||
&& wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \
|
||||
&& tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \
|
||||
&& sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb && \
|
||||
rm -rfv /tmp/*
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
50
linux/ecosystem/atlassian/jira/9/9.16.1/Makefile
Normal file
50
linux/ecosystem/atlassian/jira/9/9.16.1/Makefile
Normal file
@ -0,0 +1,50 @@
|
||||
PIP_BREAK_SYSTEM_PACKAGES=1
|
||||
|
||||
all: app
|
||||
|
||||
app:
|
||||
make build
|
||||
make deploy
|
||||
make clean
|
||||
|
||||
build:
|
||||
make pip
|
||||
python3 kaniko-build.py --version
|
||||
|
||||
dry:
|
||||
make dry-run
|
||||
|
||||
test:
|
||||
make dry-run
|
||||
|
||||
dry-run:
|
||||
python3 kaniko-build.py --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug --dry-run
|
||||
|
||||
pip:
|
||||
rm -rf /usr/lib/python3.6/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.7/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.8/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.13/EXTERNALLY-MANAGED
|
||||
pip3 install -r requirements.txt
|
||||
pip install -r requirements.txt
|
||||
|
||||
build-compose:
|
||||
docker-compose build --compress --parallel --progress plain
|
||||
|
||||
deploy:
|
||||
make pip
|
||||
python3 kaniko-build.py --deploy --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug
|
||||
|
||||
deploy-compose:
|
||||
docker-compose push
|
||||
|
||||
clean:
|
||||
docker container prune -f
|
||||
docker image prune -f
|
||||
docker network prune -f
|
||||
docker volume prune -f
|
||||
docker system prune -af
|
16
linux/ecosystem/atlassian/jira/9/9.16.1/docker-compose.yml
Normal file
16
linux/ecosystem/atlassian/jira/9/9.16.1/docker-compose.yml
Normal file
@ -0,0 +1,16 @@
|
||||
#version: '3'
|
||||
services:
|
||||
app:
|
||||
image: "epicmorg/jira:9.16.1"
|
||||
build:
|
||||
context: .
|
||||
app-jdk11:
|
||||
image: "epicmorg/jira:9.16.1-jdk11"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.jdk11
|
||||
app-jdk17:
|
||||
image: "epicmorg/jira:9.16.1-jdk17"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.jdk17
|
89
linux/ecosystem/atlassian/jira/9/9.16.1/entrypoint.sh
Executable file
89
linux/ecosystem/atlassian/jira/9/9.16.1/entrypoint.sh
Executable file
@ -0,0 +1,89 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
|
||||
export JRE_HOME="$JAVA_HOME/jre"
|
||||
export JAVA_BINARY="$JRE_HOME/bin/java"
|
||||
export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}')
|
||||
|
||||
# Setup Catalina Opts
|
||||
: ${CATALINA_CONNECTOR_PROXYNAME:=}
|
||||
: ${CATALINA_CONNECTOR_PROXYPORT:=}
|
||||
: ${CATALINA_CONNECTOR_SCHEME:=http}
|
||||
: ${CATALINA_CONNECTOR_SECURE:=false}
|
||||
|
||||
: ${CATALINA_OPTS:=}
|
||||
|
||||
: ${JAVA_OPTS:=}
|
||||
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}"
|
||||
|
||||
export JAVA_OPTS="${JAVA_OPTS} ${CATALINA_OPTS}"
|
||||
|
||||
# Setup Data Center configuration
|
||||
if [ ! -f "/etc/container_id" ]; then
|
||||
uuidgen > /etc/container_id
|
||||
fi
|
||||
CONTAINER_ID=$(cat /etc/container_id)
|
||||
CONTAINER_SHORT_ID=${CONTAINER_ID::8}
|
||||
|
||||
: ${CLUSTERED:=false}
|
||||
: ${JIRA_NODE_ID:=jira_node_${CONTAINER_SHORT_ID}}
|
||||
: ${JIRA_SHARED_HOME:=${JIRA_HOME}/shared}
|
||||
: ${EHCACHE_PEER_DISCOVERY:=}
|
||||
: ${EHCACHE_LISTENER_HOSTNAME:=}
|
||||
: ${EHCACHE_LISTENER_PORT:=}
|
||||
: ${EHCACHE_LISTENER_SOCKETTIMEOUTMILLIS:=}
|
||||
: ${EHCACHE_MULTICAST_ADDRESS:=}
|
||||
: ${EHCACHE_MULTICAST_PORT:=}
|
||||
: ${EHCACHE_MULTICAST_TIMETOLIVE:=}
|
||||
: ${EHCACHE_MULTICAST_HOSTNAME:=}
|
||||
|
||||
# Cleanly set/unset values in cluster.properties
|
||||
function set_cluster_property {
|
||||
if [ -z $2 ]; then
|
||||
if [ -f "${JIRA_HOME}/cluster.properties" ]; then
|
||||
sed -i -e "/^${1}/d" "${JIRA_HOME}/cluster.properties"
|
||||
fi
|
||||
return
|
||||
fi
|
||||
if [ ! -f "${JIRA_HOME}/cluster.properties" ]; then
|
||||
echo "${1}=${2}" >> "${JIRA_HOME}/cluster.properties"
|
||||
elif grep "^${1}" "${JIRA_HOME}/cluster.properties"; then
|
||||
sed -i -e "s#^${1}=.*#${1}=${2}#g" "${JIRA_HOME}/cluster.properties"
|
||||
else
|
||||
echo "${1}=${2}" >> "${JIRA_HOME}/cluster.properties"
|
||||
fi
|
||||
}
|
||||
|
||||
if [ "${CLUSTERED}" == "true" ]; then
|
||||
set_cluster_property "jira.node.id" "${JIRA_NODE_ID}"
|
||||
set_cluster_property "jira.shared.home" "${JIRA_SHARED_HOME}"
|
||||
set_cluster_property "ehcache.peer.discovery" "${EHCACHE_PEER_DISCOVERY}"
|
||||
set_cluster_property "ehcache.listener.hostName" "${EHCACHE_LISTENER_HOSTNAME}"
|
||||
set_cluster_property "ehcache.listener.port" "${EHCACHE_LISTENER_PORT}"
|
||||
set_cluster_property "ehcache.listener.socketTimeoutMillis" "${EHCACHE_LISTENER_PORT}"
|
||||
set_cluster_property "ehcache.multicast.address" "${EHCACHE_MULTICAST_ADDRESS}"
|
||||
set_cluster_property "ehcache.multicast.port" "${EHCACHE_MULTICAST_PORT}"
|
||||
set_cluster_property "ehcache.multicast.timeToLive" "${EHCACHE_MULTICAST_TIMETOLIVE}"
|
||||
set_cluster_property "ehcache.multicast.hostName" "${EHCACHE_MULTICAST_HOSTNAME}"
|
||||
fi
|
||||
|
||||
|
||||
# Start Jira as the correct user
|
||||
if [ "${UID}" -eq 0 ]; then
|
||||
echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}"
|
||||
PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${JIRA_HOME}")
|
||||
EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700
|
||||
if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then
|
||||
chmod -R 700 "${JIRA_HOME}" &&
|
||||
chown -R "${RUN_USER}:${RUN_GROUP}" "${JIRA_HOME}"
|
||||
fi
|
||||
# Now drop privileges
|
||||
exec su -s /bin/bash "${RUN_USER}" -c "$JIRA_INSTALL_DIR/bin/start-jira.sh $@"
|
||||
else
|
||||
exec "$JIRA_INSTALL_DIR/bin/start-jira.sh" "$@"
|
||||
fi
|
196
linux/ecosystem/atlassian/jira/9/9.16.1/kaniko-build.py
Normal file
196
linux/ecosystem/atlassian/jira/9/9.16.1/kaniko-build.py
Normal file
@ -0,0 +1,196 @@
|
||||
import os
|
||||
import shutil
|
||||
import argparse
|
||||
import yaml
|
||||
import subprocess
|
||||
from collections import defaultdict
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
from dotenv import load_dotenv
|
||||
import logging
|
||||
import sys
|
||||
|
||||
# Script version
|
||||
SCRIPT_VERSION = "1.0.1.0"
|
||||
|
||||
# ASCII art for EpicMorg
|
||||
ASCII_ART = r"""
|
||||
+=================================================+
|
||||
| ____| _) \ | |
|
||||
| __| __ \ | __| |\/ | _ \ __| _` | |
|
||||
| | | | | ( | | ( | | ( | |
|
||||
|_____| .__/ _| \___| _| _| \___/ _| \__, | |
|
||||
| | / _| _) | |___/ |
|
||||
| ' / _` | __ \ | | / _ \ |
|
||||
| . \ ( | | | | < ( | |
|
||||
|_|\_\ \__,_| _| _| _| _|\_\ \___/ |
|
||||
|\ \ / |
|
||||
| \ \ \ / __| _` | __ \ __ \ _ \ __||
|
||||
| \ \ \ / | ( | | | | | __/ | |
|
||||
| \_/\_/ _| \__,_| .__/ .__/ \___| _| |
|
||||
| _| _| |
|
||||
+=================================================+
|
||||
"""
|
||||
|
||||
# Load environment variables from .env file
|
||||
load_dotenv()
|
||||
|
||||
def setup_logging():
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
|
||||
def parse_args():
|
||||
parser = argparse.ArgumentParser(description="EpicMorg: Kaniko-Compose Wrapper", add_help=False)
|
||||
parser.add_argument('--compose-file', default=os.getenv('COMPOSE_FILE', 'docker-compose.yml'), help='Path to docker-compose.yml file')
|
||||
parser.add_argument('--kaniko-image', default=os.getenv('KANIKO_IMAGE', 'gcr.io/kaniko-project/executor:latest'), help='Kaniko executor image')
|
||||
parser.add_argument('--push', '--deploy', '-d', '-p', action='store_true', help='Deploy the built images to the registry')
|
||||
parser.add_argument('--dry-run', '--dry', action='store_true', help='Dry run: build images without pushing and with cleanup')
|
||||
parser.add_argument('--version', '-v', action='store_true', help='Show script version')
|
||||
parser.add_argument('--help', '-h', action='store_true', help='Show this help message and exit')
|
||||
return parser.parse_args()
|
||||
|
||||
def load_compose_file(file_path):
|
||||
with open(file_path, 'r') as file:
|
||||
return yaml.safe_load(file)
|
||||
|
||||
def build_with_kaniko(service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry):
|
||||
kaniko_command = [
|
||||
'docker', 'run',
|
||||
'--rm',
|
||||
'-t',
|
||||
'-v', f'{os.path.abspath(build_context)}:/workspace',
|
||||
]
|
||||
|
||||
# Add Docker config mounts for both read-only access
|
||||
kaniko_command.extend([
|
||||
'-v', '/var/run/docker.sock:/var/run/docker.sock:ro', # Access to Docker daemon
|
||||
'-v', f'{os.path.expanduser("~")}/.docker:/kaniko/.docker:ro', # Use existing Docker credentials in read-only mode
|
||||
])
|
||||
|
||||
kaniko_command.extend([
|
||||
kaniko_image,
|
||||
'--context', '/workspace',
|
||||
'--dockerfile', f'/workspace/{dockerfile}',
|
||||
'--compressed-caching',
|
||||
'--single-snapshot',
|
||||
'--cleanup'
|
||||
])
|
||||
|
||||
if deploy:
|
||||
kaniko_command.extend([
|
||||
'--destination', image_name
|
||||
])
|
||||
elif dry:
|
||||
kaniko_command.extend([
|
||||
'--no-push'
|
||||
])
|
||||
else:
|
||||
kaniko_command.extend([
|
||||
'--no-push'
|
||||
])
|
||||
|
||||
# Add build arguments if they exist
|
||||
for arg_name, arg_value in build_args.items():
|
||||
kaniko_command.extend(['--build-arg', f'{arg_name}={arg_value}'])
|
||||
|
||||
logging.info(f"Building {service_name} with Kaniko: {' '.join(kaniko_command)}")
|
||||
|
||||
process = subprocess.Popen(kaniko_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
||||
|
||||
# Stream output in real-time
|
||||
for line in process.stdout:
|
||||
logging.info(line.strip())
|
||||
|
||||
process.wait()
|
||||
|
||||
if process.returncode == 0:
|
||||
logging.info(f"Successfully built {service_name}")
|
||||
else:
|
||||
for line in process.stderr:
|
||||
logging.error(line.strip())
|
||||
logging.error(f"Error building {service_name}")
|
||||
raise Exception(f"Failed to build {service_name}")
|
||||
|
||||
def show_help():
|
||||
print(ASCII_ART)
|
||||
print("EpicMorg: Kaniko-Compose Wrapper\n")
|
||||
print("Arguments:")
|
||||
print("--compose-file Path to docker-compose.yml file")
|
||||
print("--kaniko-image Kaniko executor image")
|
||||
print("--push, --deploy, -d, -p Deploy the built images to the registry")
|
||||
print("--dry-run, --dry Dry run: build images without pushing and with cleanup")
|
||||
print("--version, -v Show script version")
|
||||
print("--help, -h Show this help message and exit")
|
||||
|
||||
def show_version():
|
||||
print(ASCII_ART)
|
||||
print(f"EpicMorg: Kaniko-Compose Wrapper {SCRIPT_VERSION}, Python: {sys.version}")
|
||||
|
||||
def main():
|
||||
setup_logging()
|
||||
|
||||
args = parse_args()
|
||||
|
||||
# Show help and exit if --help is provided
|
||||
if args.help:
|
||||
show_help()
|
||||
return
|
||||
|
||||
# Show version and exit if --version or no relevant arguments are provided
|
||||
if args.version or not (args.push or args.dry_run or args.compose_file != 'docker-compose.yml' or args.kaniko_image != 'gcr.io/kaniko-project/executor:latest'):
|
||||
show_version()
|
||||
return
|
||||
|
||||
compose_file = args.compose_file
|
||||
kaniko_image = args.kaniko_image
|
||||
deploy = args.push
|
||||
dry = args.dry_run
|
||||
|
||||
if not os.path.exists(compose_file):
|
||||
logging.error(f"{compose_file} not found")
|
||||
return
|
||||
|
||||
compose_data = load_compose_file(compose_file)
|
||||
|
||||
services = compose_data.get('services', {})
|
||||
image_names = defaultdict(int)
|
||||
|
||||
for service_name, service_data in services.items():
|
||||
image_name = service_data.get('image')
|
||||
|
||||
if not image_name:
|
||||
logging.warning(f"No image specified for service {service_name}")
|
||||
continue
|
||||
|
||||
image_names[image_name] += 1
|
||||
|
||||
for image_name, count in image_names.items():
|
||||
if count > 1:
|
||||
logging.error(f"Error: Image name {image_name} is used {count} times.")
|
||||
return
|
||||
|
||||
try:
|
||||
with ThreadPoolExecutor() as executor:
|
||||
futures = []
|
||||
for service_name, service_data in services.items():
|
||||
build_data = service_data.get('build', {})
|
||||
build_context = build_data.get('context', '.')
|
||||
dockerfile = build_data.get('dockerfile', 'Dockerfile')
|
||||
image_name = service_data.get('image')
|
||||
build_args = build_data.get('args', {})
|
||||
|
||||
# Substitute environment variables with their values if they exist
|
||||
build_args = {key: os.getenv(key, value) for key, value in build_args.items()}
|
||||
|
||||
if not image_name:
|
||||
logging.warning(f"No image specified for service {service_name}")
|
||||
continue
|
||||
|
||||
futures.append(executor.submit(build_with_kaniko, service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry))
|
||||
|
||||
for future in as_completed(futures):
|
||||
future.result()
|
||||
except Exception as exc:
|
||||
logging.error(f"Build failed: {exc}")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
2
linux/ecosystem/atlassian/jira/9/9.16.1/requirements.txt
Normal file
2
linux/ecosystem/atlassian/jira/9/9.16.1/requirements.txt
Normal file
@ -0,0 +1,2 @@
|
||||
PyYAML
|
||||
python-dotenv
|
53
linux/ecosystem/atlassian/jira/9/9.17.1/Dockerfile
Normal file
53
linux/ecosystem/atlassian/jira/9/9.17.1/Dockerfile
Normal file
@ -0,0 +1,53 @@
|
||||
FROM epicmorg/debian:bookworm-jdk8
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
|
||||
ARG RELEASE=9.17.1
|
||||
ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files
|
||||
ENV JIRA_HOME /var/atlassian/application-data/jira
|
||||
ENV JIRA_INSTALL_DIR /opt/atlassian/jira
|
||||
|
||||
VOLUME ["${JIRA_HOME}"]
|
||||
WORKDIR $JIRA_HOME
|
||||
|
||||
# Expose HTTP port
|
||||
EXPOSE 8080
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${JIRA_INSTALL_DIR} \
|
||||
&& wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \
|
||||
&& tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \
|
||||
&& sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb && \
|
||||
rm -rfv /tmp/*
|
||||
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
52
linux/ecosystem/atlassian/jira/9/9.17.1/Dockerfile.jdk11
Normal file
52
linux/ecosystem/atlassian/jira/9/9.17.1/Dockerfile.jdk11
Normal file
@ -0,0 +1,52 @@
|
||||
FROM epicmorg/debian:bookworm-jdk11
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
|
||||
ARG RELEASE=9.17.1
|
||||
ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files
|
||||
ENV JIRA_HOME /var/atlassian/application-data/jira
|
||||
ENV JIRA_INSTALL_DIR /opt/atlassian/jira
|
||||
|
||||
VOLUME ["${JIRA_HOME}"]
|
||||
WORKDIR $JIRA_HOME
|
||||
|
||||
# Expose HTTP port
|
||||
EXPOSE 8080
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${JIRA_INSTALL_DIR} \
|
||||
&& wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \
|
||||
&& tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \
|
||||
&& sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb && \
|
||||
rm -rfv /tmp/*
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
52
linux/ecosystem/atlassian/jira/9/9.17.1/Dockerfile.jdk17
Normal file
52
linux/ecosystem/atlassian/jira/9/9.17.1/Dockerfile.jdk17
Normal file
@ -0,0 +1,52 @@
|
||||
FROM epicmorg/debian:bookworm-jdk17
|
||||
LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
##################################################################
|
||||
# ARGuments
|
||||
##################################################################
|
||||
|
||||
ARG RELEASE=9.17.1
|
||||
ARG DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-${RELEASE}.tar.gz
|
||||
|
||||
##################################################################
|
||||
# Setup
|
||||
##################################################################
|
||||
ENV RUN_USER daemon
|
||||
ENV RUN_GROUP daemon
|
||||
|
||||
# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files
|
||||
ENV JIRA_HOME /var/atlassian/application-data/jira
|
||||
ENV JIRA_INSTALL_DIR /opt/atlassian/jira
|
||||
|
||||
VOLUME ["${JIRA_HOME}"]
|
||||
WORKDIR $JIRA_HOME
|
||||
|
||||
# Expose HTTP port
|
||||
EXPOSE 8080
|
||||
|
||||
##################################################################
|
||||
# Installing
|
||||
##################################################################
|
||||
RUN mkdir -p ${JIRA_INSTALL_DIR} \
|
||||
&& wget --random-wait --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" -P /tmp/ ${DOWNLOAD_URL} \
|
||||
&& tar -xzf /tmp/atlassian-jira-software-${RELEASE}.tar.gz --strip-components=1 -C "$JIRA_INSTALL_DIR" \
|
||||
&& chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \
|
||||
&& sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
|
||||
&& sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \
|
||||
&& sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
|
||||
apt clean -y && \
|
||||
apt autoclean -y && \
|
||||
rm -rfv /var/lib/apt/lists/* && \
|
||||
rm -rfv /var/cache/apt/archives/*.deb && \
|
||||
rm -rfv /tmp/*
|
||||
|
||||
RUN updatedb
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh", "-fg"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
50
linux/ecosystem/atlassian/jira/9/9.17.1/Makefile
Normal file
50
linux/ecosystem/atlassian/jira/9/9.17.1/Makefile
Normal file
@ -0,0 +1,50 @@
|
||||
PIP_BREAK_SYSTEM_PACKAGES=1
|
||||
|
||||
all: app
|
||||
|
||||
app:
|
||||
make build
|
||||
make deploy
|
||||
make clean
|
||||
|
||||
build:
|
||||
make pip
|
||||
python3 kaniko-build.py --version
|
||||
|
||||
dry:
|
||||
make dry-run
|
||||
|
||||
test:
|
||||
make dry-run
|
||||
|
||||
dry-run:
|
||||
python3 kaniko-build.py --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug --dry-run
|
||||
|
||||
pip:
|
||||
rm -rf /usr/lib/python3.6/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.7/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.8/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.9/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.12/EXTERNALLY-MANAGED
|
||||
rm -rf /usr/lib/python3.13/EXTERNALLY-MANAGED
|
||||
pip3 install -r requirements.txt
|
||||
pip install -r requirements.txt
|
||||
|
||||
build-compose:
|
||||
docker-compose build --compress --parallel --progress plain
|
||||
|
||||
deploy:
|
||||
make pip
|
||||
python3 kaniko-build.py --deploy --kaniko-image gcr.io/kaniko-project/executor:v1.23.2-debug
|
||||
|
||||
deploy-compose:
|
||||
docker-compose push
|
||||
|
||||
clean:
|
||||
docker container prune -f
|
||||
docker image prune -f
|
||||
docker network prune -f
|
||||
docker volume prune -f
|
||||
docker system prune -af
|
17
linux/ecosystem/atlassian/jira/9/9.17.1/docker-compose.yml
Normal file
17
linux/ecosystem/atlassian/jira/9/9.17.1/docker-compose.yml
Normal file
@ -0,0 +1,17 @@
|
||||
#version: '3'
|
||||
services:
|
||||
app:
|
||||
image: "epicmorg/jira:9.17.1"
|
||||
build:
|
||||
context: .
|
||||
app-jdk11:
|
||||
image: "epicmorg/jira:9.17.1-jdk11"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.jdk11
|
||||
app-jdk17:
|
||||
image: "epicmorg/jira:9.17.1-jdk17"
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.jdk17
|
||||
|
89
linux/ecosystem/atlassian/jira/9/9.17.1/entrypoint.sh
Executable file
89
linux/ecosystem/atlassian/jira/9/9.17.1/entrypoint.sh
Executable file
@ -0,0 +1,89 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
|
||||
export JRE_HOME="$JAVA_HOME/jre"
|
||||
export JAVA_BINARY="$JRE_HOME/bin/java"
|
||||
export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}')
|
||||
|
||||
# Setup Catalina Opts
|
||||
: ${CATALINA_CONNECTOR_PROXYNAME:=}
|
||||
: ${CATALINA_CONNECTOR_PROXYPORT:=}
|
||||
: ${CATALINA_CONNECTOR_SCHEME:=http}
|
||||
: ${CATALINA_CONNECTOR_SECURE:=false}
|
||||
|
||||
: ${CATALINA_OPTS:=}
|
||||
|
||||
: ${JAVA_OPTS:=}
|
||||
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}"
|
||||
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}"
|
||||
|
||||
export JAVA_OPTS="${JAVA_OPTS} ${CATALINA_OPTS}"
|
||||
|
||||
# Setup Data Center configuration
|
||||
if [ ! -f "/etc/container_id" ]; then
|
||||
uuidgen > /etc/container_id
|
||||
fi
|
||||
CONTAINER_ID=$(cat /etc/container_id)
|
||||
CONTAINER_SHORT_ID=${CONTAINER_ID::8}
|
||||
|
||||
: ${CLUSTERED:=false}
|
||||
: ${JIRA_NODE_ID:=jira_node_${CONTAINER_SHORT_ID}}
|
||||
: ${JIRA_SHARED_HOME:=${JIRA_HOME}/shared}
|
||||
: ${EHCACHE_PEER_DISCOVERY:=}
|
||||
: ${EHCACHE_LISTENER_HOSTNAME:=}
|
||||
: ${EHCACHE_LISTENER_PORT:=}
|
||||
: ${EHCACHE_LISTENER_SOCKETTIMEOUTMILLIS:=}
|
||||
: ${EHCACHE_MULTICAST_ADDRESS:=}
|
||||
: ${EHCACHE_MULTICAST_PORT:=}
|
||||
: ${EHCACHE_MULTICAST_TIMETOLIVE:=}
|
||||
: ${EHCACHE_MULTICAST_HOSTNAME:=}
|
||||
|
||||
# Cleanly set/unset values in cluster.properties
|
||||
function set_cluster_property {
|
||||
if [ -z $2 ]; then
|
||||
if [ -f "${JIRA_HOME}/cluster.properties" ]; then
|
||||
sed -i -e "/^${1}/d" "${JIRA_HOME}/cluster.properties"
|
||||
fi
|
||||
return
|
||||
fi
|
||||
if [ ! -f "${JIRA_HOME}/cluster.properties" ]; then
|
||||
echo "${1}=${2}" >> "${JIRA_HOME}/cluster.properties"
|
||||
elif grep "^${1}" "${JIRA_HOME}/cluster.properties"; then
|
||||
sed -i -e "s#^${1}=.*#${1}=${2}#g" "${JIRA_HOME}/cluster.properties"
|
||||
else
|
||||
echo "${1}=${2}" >> "${JIRA_HOME}/cluster.properties"
|
||||
fi
|
||||
}
|
||||
|
||||
if [ "${CLUSTERED}" == "true" ]; then
|
||||
set_cluster_property "jira.node.id" "${JIRA_NODE_ID}"
|
||||
set_cluster_property "jira.shared.home" "${JIRA_SHARED_HOME}"
|
||||
set_cluster_property "ehcache.peer.discovery" "${EHCACHE_PEER_DISCOVERY}"
|
||||
set_cluster_property "ehcache.listener.hostName" "${EHCACHE_LISTENER_HOSTNAME}"
|
||||
set_cluster_property "ehcache.listener.port" "${EHCACHE_LISTENER_PORT}"
|
||||
set_cluster_property "ehcache.listener.socketTimeoutMillis" "${EHCACHE_LISTENER_PORT}"
|
||||
set_cluster_property "ehcache.multicast.address" "${EHCACHE_MULTICAST_ADDRESS}"
|
||||
set_cluster_property "ehcache.multicast.port" "${EHCACHE_MULTICAST_PORT}"
|
||||
set_cluster_property "ehcache.multicast.timeToLive" "${EHCACHE_MULTICAST_TIMETOLIVE}"
|
||||
set_cluster_property "ehcache.multicast.hostName" "${EHCACHE_MULTICAST_HOSTNAME}"
|
||||
fi
|
||||
|
||||
|
||||
# Start Jira as the correct user
|
||||
if [ "${UID}" -eq 0 ]; then
|
||||
echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}"
|
||||
PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${JIRA_HOME}")
|
||||
EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700
|
||||
if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then
|
||||
chmod -R 700 "${JIRA_HOME}" &&
|
||||
chown -R "${RUN_USER}:${RUN_GROUP}" "${JIRA_HOME}"
|
||||
fi
|
||||
# Now drop privileges
|
||||
exec su -s /bin/bash "${RUN_USER}" -c "$JIRA_INSTALL_DIR/bin/start-jira.sh $@"
|
||||
else
|
||||
exec "$JIRA_INSTALL_DIR/bin/start-jira.sh" "$@"
|
||||
fi
|
196
linux/ecosystem/atlassian/jira/9/9.17.1/kaniko-build.py
Normal file
196
linux/ecosystem/atlassian/jira/9/9.17.1/kaniko-build.py
Normal file
@ -0,0 +1,196 @@
|
||||
import os
|
||||
import shutil
|
||||
import argparse
|
||||
import yaml
|
||||
import subprocess
|
||||
from collections import defaultdict
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
from dotenv import load_dotenv
|
||||
import logging
|
||||
import sys
|
||||
|
||||
# Script version
|
||||
SCRIPT_VERSION = "1.0.1.0"
|
||||
|
||||
# ASCII art for EpicMorg
|
||||
ASCII_ART = r"""
|
||||
+=================================================+
|
||||
| ____| _) \ | |
|
||||
| __| __ \ | __| |\/ | _ \ __| _` | |
|
||||
| | | | | ( | | ( | | ( | |
|
||||
|_____| .__/ _| \___| _| _| \___/ _| \__, | |
|
||||
| | / _| _) | |___/ |
|
||||
| ' / _` | __ \ | | / _ \ |
|
||||
| . \ ( | | | | < ( | |
|
||||
|_|\_\ \__,_| _| _| _| _|\_\ \___/ |
|
||||
|\ \ / |
|
||||
| \ \ \ / __| _` | __ \ __ \ _ \ __||
|
||||
| \ \ \ / | ( | | | | | __/ | |
|
||||
| \_/\_/ _| \__,_| .__/ .__/ \___| _| |
|
||||
| _| _| |
|
||||
+=================================================+
|
||||
"""
|
||||
|
||||
# Load environment variables from .env file
|
||||
load_dotenv()
|
||||
|
||||
def setup_logging():
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
|
||||
def parse_args():
|
||||
parser = argparse.ArgumentParser(description="EpicMorg: Kaniko-Compose Wrapper", add_help=False)
|
||||
parser.add_argument('--compose-file', default=os.getenv('COMPOSE_FILE', 'docker-compose.yml'), help='Path to docker-compose.yml file')
|
||||
parser.add_argument('--kaniko-image', default=os.getenv('KANIKO_IMAGE', 'gcr.io/kaniko-project/executor:latest'), help='Kaniko executor image')
|
||||
parser.add_argument('--push', '--deploy', '-d', '-p', action='store_true', help='Deploy the built images to the registry')
|
||||
parser.add_argument('--dry-run', '--dry', action='store_true', help='Dry run: build images without pushing and with cleanup')
|
||||
parser.add_argument('--version', '-v', action='store_true', help='Show script version')
|
||||
parser.add_argument('--help', '-h', action='store_true', help='Show this help message and exit')
|
||||
return parser.parse_args()
|
||||
|
||||
def load_compose_file(file_path):
|
||||
with open(file_path, 'r') as file:
|
||||
return yaml.safe_load(file)
|
||||
|
||||
def build_with_kaniko(service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry):
|
||||
kaniko_command = [
|
||||
'docker', 'run',
|
||||
'--rm',
|
||||
'-t',
|
||||
'-v', f'{os.path.abspath(build_context)}:/workspace',
|
||||
]
|
||||
|
||||
# Add Docker config mounts for both read-only access
|
||||
kaniko_command.extend([
|
||||
'-v', '/var/run/docker.sock:/var/run/docker.sock:ro', # Access to Docker daemon
|
||||
'-v', f'{os.path.expanduser("~")}/.docker:/kaniko/.docker:ro', # Use existing Docker credentials in read-only mode
|
||||
])
|
||||
|
||||
kaniko_command.extend([
|
||||
kaniko_image,
|
||||
'--context', '/workspace',
|
||||
'--dockerfile', f'/workspace/{dockerfile}',
|
||||
'--compressed-caching',
|
||||
'--single-snapshot',
|
||||
'--cleanup'
|
||||
])
|
||||
|
||||
if deploy:
|
||||
kaniko_command.extend([
|
||||
'--destination', image_name
|
||||
])
|
||||
elif dry:
|
||||
kaniko_command.extend([
|
||||
'--no-push'
|
||||
])
|
||||
else:
|
||||
kaniko_command.extend([
|
||||
'--no-push'
|
||||
])
|
||||
|
||||
# Add build arguments if they exist
|
||||
for arg_name, arg_value in build_args.items():
|
||||
kaniko_command.extend(['--build-arg', f'{arg_name}={arg_value}'])
|
||||
|
||||
logging.info(f"Building {service_name} with Kaniko: {' '.join(kaniko_command)}")
|
||||
|
||||
process = subprocess.Popen(kaniko_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
||||
|
||||
# Stream output in real-time
|
||||
for line in process.stdout:
|
||||
logging.info(line.strip())
|
||||
|
||||
process.wait()
|
||||
|
||||
if process.returncode == 0:
|
||||
logging.info(f"Successfully built {service_name}")
|
||||
else:
|
||||
for line in process.stderr:
|
||||
logging.error(line.strip())
|
||||
logging.error(f"Error building {service_name}")
|
||||
raise Exception(f"Failed to build {service_name}")
|
||||
|
||||
def show_help():
|
||||
print(ASCII_ART)
|
||||
print("EpicMorg: Kaniko-Compose Wrapper\n")
|
||||
print("Arguments:")
|
||||
print("--compose-file Path to docker-compose.yml file")
|
||||
print("--kaniko-image Kaniko executor image")
|
||||
print("--push, --deploy, -d, -p Deploy the built images to the registry")
|
||||
print("--dry-run, --dry Dry run: build images without pushing and with cleanup")
|
||||
print("--version, -v Show script version")
|
||||
print("--help, -h Show this help message and exit")
|
||||
|
||||
def show_version():
|
||||
print(ASCII_ART)
|
||||
print(f"EpicMorg: Kaniko-Compose Wrapper {SCRIPT_VERSION}, Python: {sys.version}")
|
||||
|
||||
def main():
|
||||
setup_logging()
|
||||
|
||||
args = parse_args()
|
||||
|
||||
# Show help and exit if --help is provided
|
||||
if args.help:
|
||||
show_help()
|
||||
return
|
||||
|
||||
# Show version and exit if --version or no relevant arguments are provided
|
||||
if args.version or not (args.push or args.dry_run or args.compose_file != 'docker-compose.yml' or args.kaniko_image != 'gcr.io/kaniko-project/executor:latest'):
|
||||
show_version()
|
||||
return
|
||||
|
||||
compose_file = args.compose_file
|
||||
kaniko_image = args.kaniko_image
|
||||
deploy = args.push
|
||||
dry = args.dry_run
|
||||
|
||||
if not os.path.exists(compose_file):
|
||||
logging.error(f"{compose_file} not found")
|
||||
return
|
||||
|
||||
compose_data = load_compose_file(compose_file)
|
||||
|
||||
services = compose_data.get('services', {})
|
||||
image_names = defaultdict(int)
|
||||
|
||||
for service_name, service_data in services.items():
|
||||
image_name = service_data.get('image')
|
||||
|
||||
if not image_name:
|
||||
logging.warning(f"No image specified for service {service_name}")
|
||||
continue
|
||||
|
||||
image_names[image_name] += 1
|
||||
|
||||
for image_name, count in image_names.items():
|
||||
if count > 1:
|
||||
logging.error(f"Error: Image name {image_name} is used {count} times.")
|
||||
return
|
||||
|
||||
try:
|
||||
with ThreadPoolExecutor() as executor:
|
||||
futures = []
|
||||
for service_name, service_data in services.items():
|
||||
build_data = service_data.get('build', {})
|
||||
build_context = build_data.get('context', '.')
|
||||
dockerfile = build_data.get('dockerfile', 'Dockerfile')
|
||||
image_name = service_data.get('image')
|
||||
build_args = build_data.get('args', {})
|
||||
|
||||
# Substitute environment variables with their values if they exist
|
||||
build_args = {key: os.getenv(key, value) for key, value in build_args.items()}
|
||||
|
||||
if not image_name:
|
||||
logging.warning(f"No image specified for service {service_name}")
|
||||
continue
|
||||
|
||||
futures.append(executor.submit(build_with_kaniko, service_name, build_context, dockerfile, image_name, build_args, kaniko_image, deploy, dry))
|
||||
|
||||
for future in as_completed(futures):
|
||||
future.result()
|
||||
except Exception as exc:
|
||||
logging.error(f"Build failed: {exc}")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
2
linux/ecosystem/atlassian/jira/9/9.17.1/requirements.txt
Normal file
2
linux/ecosystem/atlassian/jira/9/9.17.1/requirements.txt
Normal file
@ -0,0 +1,2 @@
|
||||
PyYAML
|
||||
python-dotenv
|
@ -826,7 +826,6 @@ RUN tar -xzf ${OPENSSL_111_TEMP} --directory /tmp && \
|
||||
ln -sf ${OPENSSL_111_SRC_DIR} ${OPENSSL_111_DIR}/src && \
|
||||
cd ${OPENSSL_111_TEMP_SRC} && \
|
||||
./config \
|
||||
no-shared \
|
||||
zlib \
|
||||
--with-zlib-include=${ZLIB_DIR}/include \
|
||||
--with-zlib-lib=${ZLIB_DIR}/lib \
|
||||
@ -852,7 +851,6 @@ RUN tar -xzf ${OPENSSL_30_TEMP} --directory /tmp && \
|
||||
ln -sf ${OPENSSL_30_SRC_DIR} ${OPENSSL_30_DIR}/src && \
|
||||
cd ${OPENSSL_30_TEMP_SRC} && \
|
||||
./config \
|
||||
no-shared \
|
||||
zlib \
|
||||
--with-zlib-include=${ZLIB_DIR}/include \
|
||||
--with-zlib-lib=${ZLIB_DIR}/lib \
|
||||
@ -881,7 +879,6 @@ RUN tar -xzf ${OPENSSL_31_TEMP} --directory /tmp && \
|
||||
ln -sf ${OPENSSL_31_SRC_DIR} ${OPENSSL_31_DIR}/src && \
|
||||
cd ${OPENSSL_31_TEMP_SRC} && \
|
||||
./config \
|
||||
no-shared \
|
||||
zlib \
|
||||
--with-zlib-include=${ZLIB_DIR}/include \
|
||||
--with-zlib-lib=${ZLIB_DIR}/lib \
|
||||
@ -910,7 +907,6 @@ RUN tar -xzf ${OPENSSL_32_TEMP} --directory /tmp && \
|
||||
ln -sf ${OPENSSL_32_SRC_DIR} ${OPENSSL_32_DIR}/src && \
|
||||
cd ${OPENSSL_32_TEMP_SRC} && \
|
||||
./config \
|
||||
no-shared \
|
||||
zlib \
|
||||
--with-zlib-include=${ZLIB_DIR}/include \
|
||||
--with-zlib-lib=${ZLIB_DIR}/lib \
|
||||
@ -941,7 +937,6 @@ RUN tar -xzf ${OPENSSL_33_TEMP} --directory /tmp && \
|
||||
ln -sf ${OPENSSL_33_SRC_DIR} ${OPENSSL_33_DIR}/src && \
|
||||
cd ${OPENSSL_33_TEMP_SRC} && \
|
||||
./config \
|
||||
no-shared \
|
||||
zlib \
|
||||
--with-zlib-include=${ZLIB_DIR}/include \
|
||||
--with-zlib-lib=${ZLIB_DIR}/lib \
|
||||
@ -984,10 +979,10 @@ RUN tar -xzf ${LIBRESSL_TEMP} --directory /tmp && \
|
||||
&& \
|
||||
make -j$(nproc) && \
|
||||
make -j$(nproc) install && \
|
||||
ln -sfv ${LIBRESSL_INC_DIR}/* /usr/local/include && \
|
||||
ln -sfv ${LIBRESSL_LIB_DIR}/* /usr/local/lib && \
|
||||
echo "# LibreSSL support" >> ${LD_CONF_DIR}/LibreSSL.conf && \
|
||||
echo ${LIBRESSL_LIB_DIR} >> ${LD_CONF_DIR}/LibreSSL.conf && \
|
||||
# ln -sfv ${LIBRESSL_INC_DIR}/* /usr/local/include && \
|
||||
# ln -sfv ${LIBRESSL_LIB_DIR}/* /usr/local/lib && \
|
||||
# echo "# LibreSSL support" >> ${LD_CONF_DIR}/LibreSSL.conf && \
|
||||
# echo ${LIBRESSL_LIB_DIR} >> ${LD_CONF_DIR}/LibreSSL.conf && \
|
||||
ldconfig
|
||||
|
||||
##################################################################
|
||||
@ -1000,13 +995,13 @@ RUN mkdir -p ${BORINGSSL_DIR} ${BORINGSSL_SRC_DIR} && \
|
||||
cd ${BORINGSSL_TEMP_SRC} && \
|
||||
mkdir ${BORINGSSL_TEMP_SRC}/build && \
|
||||
cd ${BORINGSSL_TEMP_SRC}/build && \
|
||||
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=${BORINGSSL_DIR} .. && \
|
||||
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE -DBUILD_SHARED_LIBS=1 -DCMAKE_INSTALL_PREFIX=${BORINGSSL_DIR} .. && \
|
||||
make -j$(if [ $(nproc) -gt 8 ]; then echo $(( $(nproc) / 2 )); else echo $(nproc); fi) && \
|
||||
make -j$(nproc) install && \
|
||||
ln -sfv ${BORINGSSL_INC_DIR}/* /usr/local/include && \
|
||||
ln -sfv ${BORINGSSL_LIB_DIR}/* /usr/local/lib && \
|
||||
echo "# BoringSSL support" >> ${LD_CONF_DIR}/BoringSSL.conf && \
|
||||
echo ${BORINGSSL_LIB_DIR} >> ${LD_CONF_DIR}/BoringSSL.conf && \
|
||||
# ln -sfv ${BORINGSSL_INC_DIR}/* /usr/local/include && \
|
||||
# ln -sfv ${BORINGSSL_LIB_DIR}/* /usr/local/lib && \
|
||||
# echo "# BoringSSL support" >> ${LD_CONF_DIR}/BoringSSL.conf && \
|
||||
# echo ${BORINGSSL_LIB_DIR} >> ${LD_CONF_DIR}/BoringSSL.conf && \
|
||||
ldconfig
|
||||
|
||||
##################################################################
|
||||
|
@ -10,6 +10,7 @@ ARG K_JDK_URL=https://github.com/adoptium/temurin${K_JDK_MAJOR_VERSION}-binaries
|
||||
ARG K_JDK_TEMP=/tmp/OpenJDK${K_JDK_MAJOR_VERSION}U-jdk_x64_linux_hotspot_${K_JDK_VERSION}_${K_JDK_BUILD_VERSION}.tar.gz
|
||||
|
||||
ENV JAVA_HOME=/usr/local/${K_JDK_FULL_VERSION}+${K_JDK_BUILD_VERSION}
|
||||
ENV JRE_HOME=${JAVA_HOME}
|
||||
ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
|
||||
##################################################################
|
||||
@ -17,6 +18,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
##################################################################
|
||||
ADD ${K_JDK_URL} /tmp
|
||||
RUN tar -xvzf ${K_JDK_TEMP} --directory /usr/local && \
|
||||
ln -sfv ${JAVA_HOME} /usr/jre && \
|
||||
java -version
|
||||
|
||||
##################################################################
|
||||
|
@ -10,6 +10,7 @@ ARG K_JDK_URL=https://github.com/adoptium/temurin${K_JDK_MAJOR_VERSION}-binaries
|
||||
ARG K_JDK_TEMP=/tmp/OpenJDK${K_JDK_MAJOR_VERSION}U-jdk_x64_linux_hotspot_${K_JDK_VERSION}_${K_JDK_BUILD_VERSION}.tar.gz
|
||||
|
||||
ENV JAVA_HOME=/usr/local/${K_JDK_FULL_VERSION}+${K_JDK_BUILD_VERSION}
|
||||
ENV JRE_HOME=${JAVA_HOME}
|
||||
ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
|
||||
##################################################################
|
||||
@ -17,6 +18,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
##################################################################
|
||||
ADD ${K_JDK_URL} /tmp
|
||||
RUN tar -xvzf ${K_JDK_TEMP} --directory /usr/local && \
|
||||
ln -sfv ${JAVA_HOME} /usr/jre && \
|
||||
java -version
|
||||
|
||||
##################################################################
|
||||
|
@ -10,6 +10,7 @@ ARG K_JDK_URL=https://github.com/adoptium/temurin${K_JDK_MAJOR_VERSION}-binaries
|
||||
ARG K_JDK_TEMP=/tmp/OpenJDK${K_JDK_MAJOR_VERSION}U-jdk_x64_linux_hotspot_${K_JDK_VERSION}_${K_JDK_BUILD_VERSION}.tar.gz
|
||||
|
||||
ENV JAVA_HOME=/usr/local/${K_JDK_FULL_VERSION}+${K_JDK_BUILD_VERSION}
|
||||
ENV JRE_HOME=${JAVA_HOME}
|
||||
ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
|
||||
##################################################################
|
||||
@ -17,6 +18,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
##################################################################
|
||||
ADD ${K_JDK_URL} /tmp
|
||||
RUN tar -xvzf ${K_JDK_TEMP} --directory /usr/local && \
|
||||
ln -sfv ${JAVA_HOME} /usr/jre && \
|
||||
java -version
|
||||
|
||||
##################################################################
|
||||
|
@ -10,6 +10,7 @@ ARG K_JDK_URL=https://github.com/adoptium/temurin${K_JDK_MAJOR_VERSION}-binaries
|
||||
ARG K_JDK_TEMP=/tmp/OpenJDK${K_JDK_MAJOR_VERSION}U-jdk_x64_linux_hotspot_${K_JDK_VERSION}_${K_JDK_BUILD_VERSION}.tar.gz
|
||||
|
||||
ENV JAVA_HOME=/usr/local/${K_JDK_FULL_VERSION}+${K_JDK_BUILD_VERSION}
|
||||
ENV JRE_HOME=${JAVA_HOME}
|
||||
ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
|
||||
##################################################################
|
||||
@ -17,6 +18,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
##################################################################
|
||||
ADD ${K_JDK_URL} /tmp
|
||||
RUN tar -xvzf ${K_JDK_TEMP} --directory /usr/local && \
|
||||
ln -sfv ${JAVA_HOME} /usr/jre && \
|
||||
java -version
|
||||
|
||||
##################################################################
|
||||
|
@ -10,6 +10,7 @@ ARG K_JDK_URL=https://github.com/adoptium/temurin${K_JDK_MAJOR_VERSION}-binaries
|
||||
ARG K_JDK_TEMP=/tmp/OpenJDK${K_JDK_MAJOR_VERSION}U-jdk_x64_linux_hotspot_${K_JDK_VERSION}_${K_JDK_BUILD_VERSION}.tar.gz
|
||||
|
||||
ENV JAVA_HOME=/usr/local/${K_JDK_FULL_VERSION}+${K_JDK_BUILD_VERSION}
|
||||
ENV JRE_HOME=${JAVA_HOME}
|
||||
ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
|
||||
##################################################################
|
||||
@ -17,6 +18,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
##################################################################
|
||||
ADD ${K_JDK_URL} /tmp
|
||||
RUN tar -xvzf ${K_JDK_TEMP} --directory /usr/local && \
|
||||
ln -sfv ${JAVA_HOME} /usr/jre && \
|
||||
java -version
|
||||
|
||||
##################################################################
|
||||
|
@ -10,6 +10,7 @@ ARG K_JDK_URL=https://github.com/adoptium/temurin${K_JDK_MAJOR_VERSION}-binaries
|
||||
ARG K_JDK_TEMP=/tmp/OpenJDK${K_JDK_MAJOR_VERSION}U-jdk_x64_linux_hotspot_${K_JDK_VERSION}_${K_JDK_BUILD_VERSION}.tar.gz
|
||||
|
||||
ENV JAVA_HOME=/usr/local/${K_JDK_FULL_VERSION}+${K_JDK_BUILD_VERSION}
|
||||
ENV JRE_HOME=${JAVA_HOME}
|
||||
ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
|
||||
##################################################################
|
||||
@ -17,6 +18,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
##################################################################
|
||||
ADD ${K_JDK_URL} /tmp
|
||||
RUN tar -xvzf ${K_JDK_TEMP} --directory /usr/local && \
|
||||
ln -sfv ${JAVA_HOME} /usr/jre && \
|
||||
java -version
|
||||
|
||||
##################################################################
|
||||
|
@ -10,6 +10,7 @@ ARG K_JDK_URL=https://github.com/adoptium/temurin${K_JDK_MAJOR_VERSION}-binaries
|
||||
ARG K_JDK_TEMP=/tmp/OpenJDK${K_JDK_MAJOR_VERSION}U-jdk_x64_linux_hotspot_${K_JDK_VERSION}_${K_JDK_BUILD_VERSION}.tar.gz
|
||||
|
||||
ENV JAVA_HOME=/usr/local/${K_JDK_FULL_VERSION}+${K_JDK_BUILD_VERSION}
|
||||
ENV JRE_HOME=${JAVA_HOME}
|
||||
ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
|
||||
##################################################################
|
||||
@ -17,6 +18,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
##################################################################
|
||||
ADD ${K_JDK_URL} /tmp
|
||||
RUN tar -xvzf ${K_JDK_TEMP} --directory /usr/local && \
|
||||
ln -sfv ${JAVA_HOME} /usr/jre && \
|
||||
java -version
|
||||
|
||||
##################################################################
|
||||
|
@ -10,6 +10,7 @@ ARG K_JDK_URL=https://github.com/adoptium/temurin${K_JDK_MAJOR_VERSION}-binaries
|
||||
ARG K_JDK_TEMP=/tmp/OpenJDK${K_JDK_MAJOR_VERSION}U-jdk_x64_linux_hotspot_${K_JDK_VERSION}_${K_JDK_BUILD_VERSION}.tar.gz
|
||||
|
||||
ENV JAVA_HOME=/usr/local/${K_JDK_FULL_VERSION}+${K_JDK_BUILD_VERSION}
|
||||
ENV JRE_HOME=${JAVA_HOME}
|
||||
ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
|
||||
##################################################################
|
||||
@ -17,6 +18,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
##################################################################
|
||||
ADD ${K_JDK_URL} /tmp
|
||||
RUN tar -xvzf ${K_JDK_TEMP} --directory /usr/local && \
|
||||
ln -sfv ${JAVA_HOME} /usr/jre && \
|
||||
java -version
|
||||
|
||||
##################################################################
|
||||
|
@ -8,6 +8,7 @@ ARG K_JDK_URL=http://cdn.azul.com/zulu/bin/zulu${K_JDK_VERSION}-jdk${K_JDK_BUILD
|
||||
ARG K_JDK_TEMP=/tmp/zulu${K_JDK_VERSION}-jdk${K_JDK_BUILD_VERSION}-linux_x64.tar.gz
|
||||
|
||||
ENV JAVA_HOME=/usr/local/zulu${K_JDK_VERSION}-jdk${K_JDK_BUILD_VERSION}-linux_x64
|
||||
ENV JRE_HOME=${JAVA_HOME}
|
||||
ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
|
||||
##################################################################
|
||||
@ -15,6 +16,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
##################################################################
|
||||
ADD ${K_JDK_URL} /tmp
|
||||
RUN tar -xvzf /tmp/zulu${K_JDK_VERSION}-jdk${K_JDK_BUILD_VERSION}-linux_x64.tar.gz --directory /usr/local && \
|
||||
ln -sfv ${JAVA_HOME} /usr/jre && \
|
||||
java -version
|
||||
|
||||
##################################################################
|
||||
|
@ -8,6 +8,7 @@ ARG K_JDK_URL=http://cdn.azul.com/zulu/bin/zulu${K_JDK_VERSION}-ca-jdk${K_JDK_BU
|
||||
ARG K_JDK_TEMP=/tmp/zulu${K_JDK_VERSION}-ca-jdk${K_JDK_BUILD_VERSION}-linux_x64.tar.gz
|
||||
|
||||
ENV JAVA_HOME=/usr/local/zulu${K_JDK_VERSION}-ca-jdk${K_JDK_BUILD_VERSION}-linux_x64
|
||||
ENV JRE_HOME=${JAVA_HOME}
|
||||
ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
|
||||
##################################################################
|
||||
@ -15,6 +16,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
##################################################################
|
||||
ADD ${K_JDK_URL} /tmp
|
||||
RUN tar -xvzf ${K_JDK_TEMP} --directory /usr/local && \
|
||||
ln -sfv ${JAVA_HOME} /usr/jre && \
|
||||
java -version
|
||||
|
||||
##################################################################
|
||||
|
@ -10,6 +10,7 @@ ARG K_JDK_URL=https://github.com/adoptium/temurin${K_JDK_MAJOR_VERSION}-binaries
|
||||
ARG K_JDK_TEMP=/tmp/OpenJDK${K_JDK_MAJOR_VERSION}U-jdk_x64_linux_hotspot_${K_JDK_VERSION}${K_JDK_BUILD_VERSION}.tar.gz
|
||||
|
||||
ENV JAVA_HOME=/usr/local/${K_JDK_FULL_VERSION}-${K_JDK_BUILD_VERSION}
|
||||
ENV JRE_HOME=${JAVA_HOME}
|
||||
ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
|
||||
##################################################################
|
||||
@ -17,6 +18,7 @@ ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||
##################################################################
|
||||
ADD ${K_JDK_URL} /tmp
|
||||
RUN tar -xvzf ${K_JDK_TEMP} --directory /usr/local && \
|
||||
ln -sfv ${JAVA_HOME} /usr/jre && \
|
||||
java -version
|
||||
|
||||
##################################################################
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user