Skip to content

Commit 7fbef12

Browse files
Mount the contributor image in the same place as the project itself.
Also run as domjudge, not root, by default. One can use sudo to access the root shell.
1 parent 3ff4bd1 commit 7fbef12

File tree

8 files changed

+65
-86
lines changed

8 files changed

+65
-86
lines changed

docker-contributor/Dockerfile

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,9 @@ RUN apt update \
3434
supervisor apache2-utils lsb-release \
3535
libcurl4-gnutls-dev libjsoncpp-dev libmagic-dev \
3636
enscript lpr ca-certificates less vim \
37-
php-pear php-dev software-properties-common pkg-config libcairo2-dev python3-dev \
37+
php-pear php-dev software-properties-common python3-pygments rst2pdf \
3838
&& rm -rf /var/lib/apt/lists/*
3939

40-
# Needed for building the docs
41-
RUN pip3 install pygments && pip3 install rst2pdf
42-
4340
# Forward nginx request and error logs to standard output/error. Also create directory for PHP-FPM socket
4441
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
4542
&& ln -sf /dev/stderr /var/log/nginx/error.log \
@@ -83,11 +80,6 @@ RUN for VERSION in $PHPSUPPORTED; do \
8380
done
8481
RUN update-alternatives --set php-fpm /usr/sbin/php-fpm${DEFAULTPHPVERSION}
8582

86-
# Add exposed volume
87-
VOLUME ["/domjudge"]
88-
89-
WORKDIR /domjudge
90-
9183
# Add PHP configuration
9284
RUN mkdir /php-config
9385
COPY ["php-config", "/php-config"]
@@ -114,5 +106,7 @@ COPY ["supervisor", "/etc/supervisor/conf.d/"]
114106
COPY ["sudoers-domjudge", "/etc/sudoers.d/domjudge"]
115107
RUN chmod 440 /etc/sudoers.d/domjudge
116108

109+
USER domjudge
110+
117111
# Expose HTTP port
118112
EXPOSE 80

docker-contributor/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ Next, if you are on Linux make sure you have cgroups enabled. See the [DOMjudge
3737
Now you can run DOMjudge itself using the following command:
3838

3939
```bash
40-
docker run -v [path-to-domjudge-checkout]:/domjudge -v /sys/fs/cgroup:/sys/fs/cgroup:ro --link dj-mariadb:mariadb -it -e MYSQL_HOST=mariadb -e MYSQL_USER=domjudge -e MYSQL_DATABASE=domjudge -e MYSQL_PASSWORD=djpw -e MYSQL_ROOT_PASSWORD=rootpw -p 12345:80 --name domjudge --privileged domjudge/domjudge-contributor
40+
docker run -v [path-to-domjudge-checkout]:[path-to-domjudge-checkout] -v /sys/fs/cgroup:/sys/fs/cgroup:ro --link dj-mariadb:mariadb -it -e PROJECT_DIR=[path-to-domjudge-checkout] -p 12345:80 --name domjudge --privileged domjudge/domjudge-contributor
4141
```
4242

43-
Make sure you replace `[path-to-domjudge-checkout]` with the path to your local DOMjudge checkout. On recent macOS and Windows Docker builds, you should add `:cached` at the end of the `/domjudge` volume (i.e. `-v [path-to-domjudge-checkout]:/domjudge:cached`) to speed up the webserver a lot.
43+
Make sure you replace `[path-to-domjudge-checkout]` with the path to your local DOMjudge checkout. On recent macOS and Windows Docker builds, you should add `:cached` at the end of the volume (i.e. `-v [path-to-domjudge-checkout]:[path-to-domjudge-checkout]:cached`) to speed up the webserver a lot.
4444

4545
The above command will start the container, set up DOMjudge for a maintainer install, set up the database and create a chroot to be used by the judgedaemons. It will then start nginx, PHP-FPM and two judgedaemons using supervisord.
4646

@@ -128,7 +128,7 @@ Xdebug has the following settings:
128128

129129
### Accessing the judgings
130130

131-
Because the chroot script copies some special devices into every chroot used for judging and Docker does not support having these special devices on volumes, a bind-mount is created for `/domjudge/output/judgings`. Thus, if you want to access the contents of this directory, use `docker exec -it domjudge bash` to get access into the container and go to that directory.
131+
Because the chroot script copies some special devices into every chroot used for judging and Docker does not support having these special devices on volumes, a bind-mount is created for `[path-to-domjudge-checkout]/output/judgings`. Thus, if you want to access the contents of this directory, use `docker exec -it domjudge bash` to get access into the container and go to that directory.
132132

133133
## Building the image
134134

docker-contributor/scripts/bin/extra-judges

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ then
77
fi
88

99
for id in `seq 2 3`; do
10-
supervisorctl $1 judgedaemon$id
10+
sudo supervisorctl $1 judgedaemon$id
1111
done
1212

docker-contributor/scripts/bin/submit-test-programs

Lines changed: 0 additions & 25 deletions
This file was deleted.
Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
#!/bin/bash
2-
if [[ -d /domjudge/webapp/var/log ]]
2+
if [ -z "$PROJECT_DIR" ]
33
then
4-
tail -F /domjudge/webapp/var/log/dev.log
4+
PROJECT_DIR=/domjudge
5+
fi
6+
7+
if [[ -d "${PROJECT_DIR}/webapp/var/log" ]]
8+
then
9+
tail -F "${PROJECT_DIR}/webapp/var/log/dev.log"
510
else
6-
tail -F /domjudge/webapp/var/logs/dev.log
11+
tail -F "${PROJECT_DIR}/webapp/var/logs/dev.log"
712
fi
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
#!/bin/bash
2-
phpdismod xdebug
3-
supervisorctl restart php
2+
sudo phpdismod xdebug
3+
sudo supervisorctl restart php
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
#!/bin/bash
2-
phpenmod xdebug
3-
supervisorctl restart php
2+
sudo phpenmod xdebug
3+
sudo supervisorctl restart php

docker-contributor/scripts/start.sh

Lines changed: 46 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,37 @@ function file_or_env {
1010
}
1111

1212
echo "[..] Setting timezone"
13-
ln -snf "/usr/share/zoneinfo/${CONTAINER_TIMEZONE}" /etc/localtime
14-
echo "${CONTAINER_TIMEZONE}" > /etc/timezone
15-
dpkg-reconfigure -f noninteractive tzdata
13+
sudo ln -snf "/usr/share/zoneinfo/${CONTAINER_TIMEZONE}" /etc/localtime
14+
echo "${CONTAINER_TIMEZONE}" | sudo tee /etc/timezone
15+
sudo dpkg-reconfigure -f noninteractive tzdata
1616
echo "[ok] Container timezone set to: ${CONTAINER_TIMEZONE}"; echo
1717

1818
echo "[..] Changing nginx and PHP configuration settings"
1919
# Set correct settings
20-
sed -ri -e "s/^user.*/user domjudge;/" /etc/nginx/nginx.conf
20+
sudo sed -ri -e "s/^user.*/user domjudge;/" /etc/nginx/nginx.conf
2121
for VERSION in $PHPSUPPORTED
2222
do
23-
sed -ri -e "s/^upload_max_filesize.*/upload_max_filesize = 100M/" \
23+
sudo sed -ri -e "s/^upload_max_filesize.*/upload_max_filesize = 100M/" \
2424
-e "s/^post_max_size.*/post_max_size = 100M/" \
2525
-e "s/^memory_limit.*/memory_limit = 2G/" \
2626
-e "s/^max_file_uploads.*/max_file_uploads = 200/" \
2727
-e "s#^;date\.timezone.*#date.timezone = ${CONTAINER_TIMEZONE}#" \
2828
"/etc/php/${VERSION}/fpm/php.ini"
29-
sed -ri -e "s#^;date\.timezone.*#date.timezone = ${CONTAINER_TIMEZONE}#" \
29+
sudo sed -ri -e "s#^;date\.timezone.*#date.timezone = ${CONTAINER_TIMEZONE}#" \
3030
"/etc/php/${VERSION}/cli/php.ini"
3131
done
3232
echo "[ok] Done changing nginx and PHP configuration settings"; echo
3333

34-
cd /domjudge
34+
if [ -z "$PROJECT_DIR" ]
35+
then
36+
PROJECT_DIR=/domjudge
37+
fi
38+
39+
cd "$PROJECT_DIR"
3540

3641
if [[ ! -f README.md ]] || ! grep -q DOMjudge README.md
3742
then
38-
echo "DOMjudge sources not found. Did you add a volume with your DOMjudge checkout at /domjudge?"
43+
echo "DOMjudge sources not found. Did you add a volume with your DOMjudge checkout at ${PROJECT_DIR}?"
3944
exit 1
4045
fi
4146

@@ -48,7 +53,6 @@ host=${MYSQL_HOST}
4853
user=root
4954
password=${MYSQL_ROOT_PASSWORD}
5055
EOF
51-
chown domjudge: /home/domjudge/.my.cnf
5256

5357
echo "[..] Updating database credentials file"
5458
echo "dummy:${MYSQL_HOST}:${MYSQL_DATABASE}:${MYSQL_USER}:${MYSQL_PASSWORD}" > etc/dbpasswords.secret
@@ -59,15 +63,15 @@ then
5963
echo "Skipping maintainer-mode install for DOMjudge"
6064
else
6165
echo "[..] Performing maintainer-mode install for DOMjudge"
62-
sudo -H -u domjudge make maintainer-conf CONFIGURE_FLAGS="--with-baseurl=http://localhost/ --with-webserver-group=domjudge"
63-
sudo -H -u domjudge make maintainer-install
66+
make maintainer-conf CONFIGURE_FLAGS="--with-baseurl=http://localhost/ --with-webserver-group=domjudge"
67+
make maintainer-install
6468
echo "[ok] DOMjudge installed in Maintainer-mode"; echo
6569
fi
6670

6771
echo "[..] Setting up bind mount and correct permissions for judgings"
68-
mkdir -p /domjudge-judgings
69-
mount -o bind /domjudge-judgings /domjudge/output/judgings
70-
chown -R domjudge output
72+
sudo mkdir -p /domjudge-judgings
73+
sudo mount -o bind /domjudge-judgings "${PROJECT_DIR}/output/judgings"
74+
sudo chown -R domjudge output
7175
echo "[ok] Done setting up permissions"
7276

7377
# Sometimes when running `docker-compose up` we're too fast at this step
@@ -91,13 +95,13 @@ then
9195
exit 1
9296
fi
9397

94-
if ! bin/dj_setup_database -uroot -p"${MYSQL_ROOT_PASSWORD}" status > /dev/null 2>&1
98+
if ! sudo bin/dj_setup_database -uroot -p"${MYSQL_ROOT_PASSWORD}" status > /dev/null 2>&1
9599
then
96100
echo " Database not installed; installing..."
97-
bin/dj_setup_database -uroot -p"${MYSQL_ROOT_PASSWORD}" bare-install
101+
sudo bin/dj_setup_database -uroot -p"${MYSQL_ROOT_PASSWORD}" bare-install
98102
else
99103
echo " Database installed; upgrading..."
100-
bin/dj_setup_database -uroot -p"${MYSQL_ROOT_PASSWORD}" upgrade
104+
sudo bin/dj_setup_database -uroot -p"${MYSQL_ROOT_PASSWORD}" upgrade
101105
fi
102106
echo "[ok] Database ready"; echo
103107

@@ -107,63 +111,64 @@ echo "[ok] Changed restapi URL from http://localhost/domjudge to http://localhos
107111

108112
echo "[..] Copying webserver config"
109113
# Set up vhost
110-
cp etc/nginx-conf /etc/nginx/sites-enabled/default
114+
sudo cp etc/nginx-conf /etc/nginx/sites-enabled/default
111115
# Replace nginx php socket location
112-
sed -i 's/server unix:.*/server unix:\/var\/run\/php-fpm-domjudge.sock;/' /etc/nginx/sites-enabled/default
116+
sudo sed -i 's/server unix:.*/server unix:\/var\/run\/php-fpm-domjudge.sock;/' /etc/nginx/sites-enabled/default
113117
# Remove default FPM pool config and link in DOMjudge version
114118
for VERSION in $PHPSUPPORTED
115119
do
116120
if [[ -f /etc/php/${VERSION}/fpm/pool.d/www.conf ]]
117121
then
118-
rm "/etc/php/${VERSION}/fpm/pool.d/www.conf"
122+
sudo rm "/etc/php/${VERSION}/fpm/pool.d/www.conf"
119123
fi
120124
if [[ ! -f /etc/php/${VERSION}/fpm/pool.d/domjudge.conf ]]
121125
then
122-
ln -s /domjudge/etc/domjudge-fpm.conf "/etc/php/${VERSION}/fpm/pool.d/domjudge.conf"
126+
sudo ln -s "${PROJECT_DIR}/etc/domjudge-fpm.conf" "/etc/php/${VERSION}/fpm/pool.d/domjudge.conf"
123127
fi
124128
# Change pm.max_children
125-
sed -i "s/^pm\.max_children = .*$/pm.max_children = ${FPM_MAX_CHILDREN}/" "/etc/php/${VERSION}/fpm/pool.d/domjudge.conf"
129+
sudo sed -i "s/^pm\.max_children = .*$/pm.max_children = ${FPM_MAX_CHILDREN}/" "/etc/php/${VERSION}/fpm/pool.d/domjudge.conf"
126130
done
127131

128-
chown domjudge: /domjudge/etc/dbpasswords.secret
129-
chown domjudge: /domjudge/etc/restapi.secret
130-
# shellcheck disable=SC2034
131-
HAS_INNER_NGINX=1
132-
cp etc/nginx-conf-inner /etc/nginx/snippets/domjudge-inner
132+
sudo chown domjudge: "${PROJECT_DIR}/etc/dbpasswords.secret"
133+
sudo chown domjudge: "${PROJECT_DIR}/etc/restapi.secret"
134+
sudo cp etc/nginx-conf-inner /etc/nginx/snippets/domjudge-inner
133135
NGINX_CONFIG_FILE=/etc/nginx/snippets/domjudge-inner
134-
sed -i 's/\/domjudge\/etc\/nginx-conf-inner/\/etc\/nginx\/snippets\/domjudge-inner/' /etc/nginx/sites-enabled/default
136+
sudo sed -i "s|${PROJECT_DIR}/etc/nginx-conf-inner|/etc/nginx/snippets/domjudge-inner|" /etc/nginx/sites-enabled/default
135137
# Run DOMjudge in root
136-
sed -i '/^# location \//,/^# \}/ s/# //' $NGINX_CONFIG_FILE
137-
sed -i '/^location \/domjudge/,/^\}/ s/^/#/' $NGINX_CONFIG_FILE
138-
sed -i 's/\/domjudge;/"";/' $NGINX_CONFIG_FILE
138+
sudo sed -i '/^# location \//,/^# \}/ s/# //' $NGINX_CONFIG_FILE
139+
sudo sed -i '/^location \/domjudge/,/^\}/ s/^/#/' $NGINX_CONFIG_FILE
140+
sudo sed -i 's/\/domjudge;/"";/' $NGINX_CONFIG_FILE
139141
# Remove access_log and error_log entries
140-
sed -i '/access_log/d' $NGINX_CONFIG_FILE
141-
sed -i '/error_log/d' $NGINX_CONFIG_FILE
142+
sudo sed -i '/access_log/d' $NGINX_CONFIG_FILE
143+
sudo sed -i '/error_log/d' $NGINX_CONFIG_FILE
142144
# Use debug front controller
143-
sed -i 's/app\.php/app_dev.php/g' $NGINX_CONFIG_FILE
144-
sed -i 's/app\\\.php/app\\_dev.php/g' $NGINX_CONFIG_FILE
145+
sudo sed -i 's/app\.php/app_dev.php/g' $NGINX_CONFIG_FILE
146+
sudo sed -i 's/app\\\.php/app\\_dev.php/g' $NGINX_CONFIG_FILE
145147
# Set up permissions (make sure the script does not stop if this fails, as this will happen on macOS / Windows)
146-
chown domjudge: /domjudge/webapp/var
148+
sudo chown domjudge: "${PROJECT_DIR}/webapp/var"
147149
echo "[ok] Webserver config installed"; echo
148150

149151
if [[ ! -d /chroot/domjudge ]]
150152
then
151153
echo "[..] Setting up chroot"
152-
bin/dj_make_chroot
154+
sudo bin/dj_make_chroot
153155
echo "[ok] Done setting up chroot"; echo
154156
fi
155157

156158
echo "[..] Setting up cgroups"
157159
if [[ -f bin/create_cgroups ]]
158160
then
159-
bin/create_cgroups
161+
sudo bin/create_cgroups
160162
else
161-
judge/create_cgroups
163+
sudo judge/create_cgroups
162164
fi
163165
echo "[ok] cgroups set up"; echo
164166

165167
echo "[..] Adding sudoers configuration"
166-
cp etc/sudoers-domjudge /etc/sudoers.d/
168+
sudo cp etc/sudoers-domjudge /etc/sudoers.d/
167169
echo "[ok] Sudoers configuration added"; echo
168170

169-
exec supervisord -n -c /etc/supervisor/supervisord.conf
171+
sudo sed -i "s|/domjudge|${PROJECT_DIR}|" /etc/supervisor/conf.d/judgedaemon.conf
172+
sudo sed -i "s|/domjudge|${PROJECT_DIR}|" /etc/supervisor/conf.d/judgedaemonextra.conf
173+
174+
exec sudo supervisord -n -c /etc/supervisor/supervisord.conf

0 commit comments

Comments
 (0)