因为应用容器化部署已经是标准化的流程,无需再详篇介绍具体的部署流程。所以本文只提供相关的配置文档。如果对部署过程不了解的同学,请先自学容器基础。
镜像已经创建好了,如下

1
2
docker.io/xhuaustc/jira-software:7.11.0
docker.io/xhuaustc/atlassian-mysql:5.7

镜像构建配置

Jira容器构建

1
git clone https://github.com/cptactionhank/docker-atlassian-jira-software

将setenv.sh与atlassian-extras-3.2.jar拷贝到docker-atlassian-jira-software

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# setenv.sh
#
# One way to set the JIRA HOME path is here via this variable. Simply uncomment it and set a valid path like /jira/home. You can of course set it outside in the command terminal. That will also work.
#
#JIRA_HOME=""

#
# Occasionally Atlassian Support may recommend that you set some specific JVM arguments. You can use this variable below to do that.
#
JVM_SUPPORT_RECOMMENDED_ARGS=""

#
# The following 2 settings control the minimum and maximum given to the JIRA Java virtual machine. In larger JIRA instances, the maximum amount will need to be increased.
#
JVM_MINIMUM_MEMORY=${JVM_XMS:-384m}
JVM_MAXIMUM_MEMORY=${JVM_XMX:-768m}

#
# The following are the required arguments for JIRA.
#
JVM_REQUIRED_ARGS='-Djava.awt.headless=true -Datlassian.standalone=JIRA -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true -Dmail.mime.decodeparameters=true -Dorg.dom4j.factory=com.atlassian.core.xml.InterningDocumentFactory'

# Uncomment this setting if you want to import data without notifications
#
#DISABLE_NOTIFICATIONS=" -Datlassian.mail.senddisabled=true -Datlassian.mail.fetchdisabled=true -Datlassian.mail.popdisabled=true"


#-----------------------------------------------------------------------------------
#
# In general don't make changes below here
#
#-----------------------------------------------------------------------------------

#-----------------------------------------------------------------------------------
# Prevents the JVM from suppressing stack traces if a given type of exception
# occurs frequently, which could make it harder for support to diagnose a problem.
#-----------------------------------------------------------------------------------
JVM_EXTRA_ARGS="-XX:-OmitStackTraceInFastThrow"

PRGDIR=`dirname "$0"`
cat "${PRGDIR}"/jirabanner.txt

JIRA_HOME_MINUSD=""
if [ "$JIRA_HOME" != "" ]; then
echo $JIRA_HOME | grep -q " "
if [ $? -eq 0 ]; then
echo ""
echo "--------------------------------------------------------------------------------------------------------------------"
echo " WARNING : You cannot have a JIRA_HOME environment variable set with spaces in it. This variable is being ignored"
echo "--------------------------------------------------------------------------------------------------------------------"
else
JIRA_HOME_MINUSD=-Djira.home=$JIRA_HOME
fi
fi

JAVA_OPTS="-Xms${JVM_MINIMUM_MEMORY} -Xmx${JVM_MAXIMUM_MEMORY} ${JAVA_OPTS} ${JVM_REQUIRED_ARGS} ${DISABLE_NOTIFICATIONS} ${JVM_SUPPORT_RECOMMENDED_ARGS} ${JVM_EXTRA_ARGS} ${JIRA_HOME_MINUSD} ${START_JIRA_JAVA_OPTS}"

export JAVA_OPTS

# DO NOT remove the following line
# !INSTALLER SET JAVA_HOME

echo ""
echo "If you encounter issues starting or stopping JIRA, please see the Troubleshooting guide at http://confluence.atlassian.com/display/JIRA/Installation+Troubleshooting+Guide"
echo ""
if [ "$JIRA_HOME_MINUSD" != "" ]; then
echo "Using JIRA_HOME: $JIRA_HOME"
fi

# set the location of the pid file
if [ -z "$CATALINA_PID" ] ; then
if [ -n "$CATALINA_BASE" ] ; then
CATALINA_PID="$CATALINA_BASE"/work/catalina.pid
elif [ -n "$CATALINA_HOME" ] ; then
CATALINA_PID="$CATALINA_HOME"/work/catalina.pid
fi
fi
export CATALINA_PID

if [ -z "$CATALINA_BASE" ]; then
if [ -z "$CATALINA_HOME" ]; then
LOGBASE=$PRGDIR
LOGTAIL=..
else
LOGBASE=$CATALINA_HOME
LOGTAIL=.
fi
else
LOGBASE=$CATALINA_BASE
LOGTAIL=.
fi

PUSHED_DIR=`pwd`
cd $LOGBASE
cd $LOGTAIL
LOGBASEABS=`pwd`
cd $PUSHED_DIR

echo ""
echo "Server startup logs are located in $LOGBASEABS/logs/catalina.out"

# Set the JVM arguments used to start JIRA. For a description of the options, see
# http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

#-----------------------------------------------------------------------------------
# This allows us to actually debug GC related issues by correlating timestamps
# with other parts of the application logs.
#-----------------------------------------------------------------------------------
GC_JVM_PARAMETERS=""
GC_JVM_PARAMETERS="-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCCause ${GC_JVM_PARAMETERS}"
GC_JVM_PARAMETERS="-Xloggc:$LOGBASEABS/logs/atlassian-jira-gc-%t.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M ${GC_JVM_PARAMETERS}"

CATALINA_OPTS="${GC_JVM_PARAMETERS} ${CATALINA_OPTS}"
export CATALINA_OPTS

构建Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#Dockerfile
FROM openjdk:8-alpine

# Configuration variables.
ENV JIRA_HOME /var/atlassian/jira
ENV JIRA_INSTALL /opt/atlassian/jira
ENV JIRA_VERSION 7.11.0

# Install Atlassian JIRA and helper tools and setup initial home
# directory structure.
RUN set -x \
&& apk add --no-cache curl xmlstarlet bash ttf-dejavu libc6-compat \
&& mkdir -p "${JIRA_HOME}" \
&& mkdir -p "${JIRA_HOME}/caches/indexes" \
&& chmod -R 777 "${JIRA_HOME}" \
&& mkdir -p "${JIRA_INSTALL}/conf/Catalina" \
&& curl -Ls "https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-7.11.0.tar.gz" | tar -xz --directory "${JIRA_INSTALL}" --strip-components=1 --no-same-owner \
&& curl -Ls "https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.38.tar.gz" | tar -xz --directory "${JIRA_INSTALL}/lib" --strip-components=1 --no-same-owner "mysql-connector-java-5.1.38/mysql-connector-java-5.1.38-bin.jar" \
&& rm -f "${JIRA_INSTALL}/lib/postgresql-9.1-903.jdbc4-atlassian-hosted.jar" \
&& curl -Ls "https://jdbc.postgresql.org/download/postgresql-42.2.1.jar" -o "${JIRA_INSTALL}/lib/postgresql-42.2.1.jar" \
&& chmod -R 777 "${JIRA_INSTALL}/conf" \
&& chmod -R 777 "${JIRA_INSTALL}/logs" \
&& chmod -R 777 "${JIRA_INSTALL}/temp" \
&& chmod -R 777 "${JIRA_INSTALL}/work" \
&& sed --in-place "s/java version/openjdk version/g" "${JIRA_INSTALL}/bin/check-java.sh" \
&& echo -e "\njira.home=$JIRA_HOME" >> "${JIRA_INSTALL}/atlassian-jira/WEB-INF/classes/jira-application.properties" \
&& touch -d "@0" "${JIRA_INSTALL}/conf/server.xml"

# Use the default unprivileged account. This could be considered bad practice
# on systems where multiple processes end up being executed by 'daemon' but
# here we only ever run one process anyway.

# Expose default HTTP connector port.
EXPOSE 8080

# Set volume mount points for installation and home directory. Changes to the
# home directory needs to be persisted as well as parts of the installation
# directory due to eg. logs.
VOLUME ["/var/atlassian/jira", "/opt/atlassian/jira/logs"]

# Set the default working directory as the installation directory.
WORKDIR /var/atlassian/jira

COPY "docker-entrypoint.sh" "/"
COPY atlassian-extras-3.2.jar ${JIRA_INSTALL}/atlassian-jira/WEB-INF/lib/atlassian-extras-3.2.jar
COPY setenv.sh ${JIRA_INSTALL}/bin/setenv.sh
ENTRYPOINT ["/docker-entrypoint.sh"]

# Run Atlassian JIRA as a foreground process by default.
CMD ["/opt/atlassian/jira/bin/start-jira.sh", "-fg"]

构建对应的Mysql镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# my.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
character_set_server=utf8
init_connect='SET NAMES utf8'
collation_server=utf8_bin
transaction_isolation='read-committed'

# Custom config should go here
!includedir /etc/mysql/conf.d/

Dockerfile文件

1
2
FROM mysql:5.7
COPY my.cnf /etc/mysql/my.cnf

部署镜像

构建docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
jira:
image: xhuaustc/jira-software:7.11.0
restart: always
environment:
- JVM_XMX=2048m
- JVM_XMS=1024m
ports:
- '8080:8080'
links:
- db
volumes:
- ./data/jira:/var/atlassian/jira
- ./data/logs:/opt/atlassian/jira/logs

db:
image: xhuaustc/atlassian-mysql:5.7
restart: always
environment:
- MYSQL_USER=jira
- MYSQL_PASSWORD=jira
- MYSQL_DATABASE=jira
- MYSQL_ROOT_PASSWORD=jira
volumes:
- ./data/mysql:/var/lib/mysql

Openshift Jira模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
apiVersion: v1
kind: Template
metadata:
name: jira
objects:
- apiVersion: v1
kind: DeploymentConfig
metadata:
labels:
run: jira
name: jira
spec:
replicas: 1
selector:
run: jira
strategy:
type: Recreate
template:
metadata:
labels:
run: jira
spec:
containers:
- env:
- name: JVM_XMX
value: 2048m
- name: JVM_XMS
value: 1024m
image: docker.io/xhuaustc/jira-software:7.11.0
imagePullPolicy: IfNotPresent
name: jira
volumeMounts:
- mountPath: /var/atlassian/jira
name: volume-7iy6x
- mountPath: /opt/atlassian/jira/logs
name: volume-zsyly
volumes:
- name: volume-7iy6x
persistentVolumeClaim:
claimName: jira
- name: volume-zsyly
persistentVolumeClaim:
claimName: jira-log
triggers:
- type: ConfigChange
- apiVersion: v1
kind: DeploymentConfig
metadata:
labels:
run: mysql-jira
name: mysql-jira
spec:
replicas: 1
selector:
run: mysql-jira
strategy:
type: Recreate
template:
metadata:
labels:
run: mysql-jira
spec:
containers:
- env:
- name: MYSQL_USER
value: jira
- name: MYSQL_PASSWORD
value: jira
- name: MYSQL_DATABASE
value: jira
- name: MYSQL_ROOT_PASSWORD
value: jira
image: docker.io/xhuaustc/atlassian-mysql:5.7
imagePullPolicy: IfNotPresent
name: mysql-jira
volumeMounts:
- mountPath: /var/lib/mysql
name: volume-uiwfa
volumes:
- name: volume-uiwfa
persistentVolumeClaim:
claimName: mysql-jira-data
triggers:
- type: ConfigChange
- apiVersion: v1
kind: Service
metadata:
labels:
run: jira
name: jira
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
run: jira
type: ClusterIP
- apiVersion: v1
kind: Service
metadata:
labels:
run: mysql-jira
name: mysql-jira
spec:
ports:
- port: 3306
protocol: TCP
targetPort: 3306
selector:
run: mysql-jira
type: ClusterIP
- apiVersion: v1
kind: Route
metadata:
annotations:
haproxy.router.openshift.io/timeout: 3000s
labels:
run: jira
name: jira
spec:
port:
targetPort: 8080
to:
kind: Service
name: jira
weight: 100
wildcardPolicy: None
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
annotations:
volume.beta.kubernetes.io/storage-class: ceph-rbd-sc
volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/rbd
name: jira
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
annotations:
volume.beta.kubernetes.io/storage-class: ceph-rbd-sc
volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/rbd
name: jira-log
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
annotations:
volume.beta.kubernetes.io/storage-class: ceph-rbd-sc
volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/rbd
name: mysql-jira-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi